为什么我的 Ansible Playbook 将我的 Jinja2 表达式捕获为字符串?

问题描述 投票:0回答:0

我有这个连接到 Cisco 路由器的 Ansible playbook,寻找“Loopback”接口(这是 Cisco 的东西),然后在最后打印出所有找到的“Loopbacks”:

---
- name: Print Loopback interface names on Cisco routers
  hosts: my_routers
  gather_facts: no
  tasks:
    - name: show ints, look for Loopbacks
      cisco.ios.ios_command:
        commands: show interfaces | include Loopback
      register:  infoCapture

    - name: Extract Loopback interface names
      set_fact:
              loopback_interface_names: "{ infoCapture.stdout_lines[0] | regex_findall('Loopback\\d+') }"

    - name: Display Loopback interface names
      debug:
        var: loopback_interface_names

  vars:
          ansible_connection: network_cli
          ansible_network_os: ios
          ansible_user: user1
          ansible_password: password1
          ansible_become: yes
          ansible_become_method: enable
          ansible_become_password: enable_password

我的剧本有点长,但基础知识都在那里。在每个路由器上,执行以下操作:

  • 运行
    show interfaces | include Loopback
    命令
  • 通过该命令输出,提取找到的任何
    Loopback__
    子字符串
  • 在调试消息中打印结果

但是第二步有问题。这是我运行剧本时的完整输出:

me@ubuntu01:~/sandbox$
me@ubuntu01:~/sandbox$ ansible-playbook listLoopbacks.yml -i /home/me/sandbox/routers.txt

PLAY [Print Loopback interface names on Cisco routers] ************************************************************************

TASK [show ints, look for Loopbacks] ******************************************************************************************
Wednesday 03 May 2023  20:18:26 +0000 (0:00:00.037)       0:00:00.037 *********
ok: [10.10.10.101]
ok: [10.10.10.102]
ok: [10.10.10.103]

TASK [Extract Loopback interface names] ***************************************************************************************
Wednesday 03 May 2023  20:18:31 +0000 (0:00:05.681)       0:00:05.719 *********
ok: [10.10.10.101]
ok: [10.10.10.103]
ok: [10.10.10.102]

TASK [Display Loopback interface names] ***************************************************************************************
Wednesday 03 May 2023  20:18:32 +0000 (0:00:00.788)       0:00:06.508 *********
ok: [10.10.10.101] =>
  loopback_interface_names: '{ infoCapture.stdout_lines[0] | regex_findall(''Loopback\d+'') }'
ok: [10.10.10.103] =>
  loopback_interface_names: '{ infoCapture.stdout_lines[0] | regex_findall(''Loopback\d+'') }'
ok: [10.10.10.102] =>
  loopback_interface_names: '{ infoCapture.stdout_lines[0] | regex_findall(''Loopback\d+'') }'

PLAY RECAP ********************************************************************************************************************
10.10.10.101                : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
10.10.10.103                : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
10.10.10.102                : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Playbook run took 0 days, 0 hours, 0 minutes, 7 seconds
Wednesday 03 May 2023  20:18:33 +0000 (0:00:00.864)       0:00:07.372 *********
===============================================================================
show ints, look for Loopbacks ------------------------------------------------------------------------------------------ 5.68s
Display Loopback interface names --------------------------------------------------------------------------------------- 0.87s
Extract Loopback interface names --------------------------------------------------------------------------------------- 0.79s

如您所见,第二步 (

"{ infoCapture.stdout_lines[0] | regex_findall('Loopback\\d+') }"
) 中的 Jinja2 表达式未被评估为 Jinja2 表达式,而是被捕获为文本字符串。那可不行。我显然在剧本的这一部分犯了语法错误:

- set_fact:
      loopback_interface_names: "{ infoCapture.stdout_lines[0] | regex_findall('Loopback\\d+') }"

但问题是什么?这让我发疯。

更多信息: 我正在运行 Ansible / Ansible-Playbook ver 2.10.7 。我的 Ubuntu 平台是 18.04.5 LTS。

另外:当我打印那个

infoCapture
变量以查看在 Jinja2 表达式咀嚼它之前从路由器中拉出什么时,我看到了下面的内容。可以看到,里面有不止一个
Loopback__
子串:

ok: [10.10.10.103] =>
  infoCapture:
    ansible_facts:
      discovered_interpreter_python: /usr/bin/python
    changed: false
    deprecations:
    - msg: Distribution Ubuntu 18.04 on host 10.10.10.103 should use /usr/bin/python3, but is using /usr/bin/python for backward compatibility with prior Ansible releases. A future Ansible release will default to using the discovered platform python for this host. See https://docs.ansible.com/ansible/2.10/reference_appendices/interpreter_discovery.html for more information
      version: '2.12'
    failed: false
    stdout:
    - |-
      Wed Jul 20 04:47:02.938 UTC
      Loopback0 is up, line protocol is up
        Hardware is Loopback interface(s)
        Encapsulation Loopback,  loopback not set,
      Loopback10 is up, line protocol is up
        Hardware is Loopback interface(s)
        Encapsulation Loopback,  loopback not set,
    stdout_lines:
    - - Wed Jul 20 04:47:02.938 UTC
      - 'Loopback0 is up, line protocol is up '
      - '  Hardware is Loopback interface(s)'
      - '  Encapsulation Loopback,  loopback not set,'
      - 'Loopback10 is up, line protocol is up '
      - '  Hardware is Loopback interface(s)'
      - '  Encapsulation Loopback,  loopback not set,'
ansible syntax jinja2
© www.soinside.com 2019 - 2024. All rights reserved.