在网络模块中使用命令输出和提示
网络模块中的条件语句
Ansible 允许您使用条件语句来控制 playbook 的流程。Ansible 网络命令模块使用以下独特的条件语句。
eq
- 等于neq
- 不等于gt
- 大于ge
- 大于或等于lt
- 小于le
- 小于或等于contains
- 对象包含指定项
条件语句评估从远程设备上执行的命令的结果。一旦任务执行了命令集,就可以使用 wait_for
参数在返回 Ansible playbook 控制权之前评估结果。
例如
---
- name: wait for interface to be admin enabled
arista.eos.eos_command:
commands:
- show interface Ethernet4 | json
wait_for:
- "result[0].interfaces.Ethernet4.interfaceStatus eq connected"
在上面的示例任务中,命令 show interface Ethernet4 | json
在远程设备上执行,并评估结果。如果路径 (result[0].interfaces.Ethernet4.interfaceStatus)
不等于“connected”,则重试该命令。此过程将持续进行,直到满足条件或重试次数超过限制(默认情况下,为 1 秒间隔的 10 次重试)。
commands 模块还可以评估接口中多个命令结果集。例如
---
- name: wait for interfaces to be admin enabled
arista.eos.eos_command:
commands:
- show interface Ethernet4 | json
- show interface Ethernet5 | json
wait_for:
- "result[0].interfaces.Ethernet4.interfaceStatus eq connected"
- "result[1].interfaces.Ethernet5.interfaceStatus eq connected"
在上面的示例中,两个命令在远程设备上执行,并评估结果。通过指定结果索引值(0 或 1),可以根据条件检查正确的结果输出。
wait_for
参数必须始终以 result 开头,然后是 []
中的命令索引,其中 0
是 commands 列表中的第一个命令,1
是第二个命令,2
是第三个命令,依此类推。
在网络模块中处理提示
网络设备可能要求您在对设备进行更改之前回答提示。各个网络模块(例如 cisco.ios.ios_command 和 cisco.nxos.nxos_command)可以使用 prompt
参数来处理这种情况。
注意
prompt
是一个 Python 正则表达式。如果在 prompt
值中添加特殊字符(例如 ?
),则提示不会匹配,并且您将获得超时错误。为避免这种情况,请确保 prompt
值是一个与实际设备提示匹配的 Python 正则表达式。必须在 prompt
正则表达式中正确处理任何特殊字符。
您还可以使用 ansible.netcommon.cli_command 来处理多个提示。
---
- name: multiple prompt, multiple answer (mandatory check for all prompts)
ansible.netcommon.cli_command:
command: "copy sftp sftp://user@host//user/test.img"
check_all: True
prompt:
- "Confirm download operation"
- "Password"
- "Do you want to change that to the standby image"
answer:
- 'y'
- <password>
- 'y'
您必须按相同的顺序列出提示和答案(即,prompt[0] 由 answer[0] 回答)。
在上面的示例中,check_all: True
确保任务为每个提示提供匹配的答案。如果没有此设置,具有多个提示的任务将为每个提示提供第一个答案。
在以下示例中,第二个答案将被忽略,并且 y
将作为两个提示的答案。也就是说,此任务仅在两个答案都相同的情况下有效。再次注意,prompt
必须是 Python 正则表达式,这就是为什么在第一个提示中对 ?
进行转义的原因。
---
- name: reboot ios device
ansible.netcommon.cli_command:
command: reload
prompt:
- Save\?
- confirm
answer:
- y
- y
另请参阅
- 使用 Ansible 重启网络设备
使用
wait_for
、wait_for_connection
和prompt
的网络设备示例。- 深入了解 cli_command
有关如何使用
cli_command
的详细概述。