我有这个连接到 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,'