在网络模块中使用命令输出和提示符
网络模块中的条件语句
Ansible 允许您使用条件语句来控制剧本的流程。Ansible 网络命令模块使用以下独特的条件语句。
eq
- 等于neq
- 不等于gt
- 大于ge
- 大于或等于lt
- 小于le
- 小于或等于contains
- 对象包含指定项
条件语句评估从在设备上远程执行的命令中获得的结果。任务执行完命令集后,可以使用 wait_for
参数来评估结果,然后再将控制权返回给 Ansible 剧本。
例如
---
- 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)
不等于“已连接”,则会重试命令。此过程会持续进行,直到满足条件或重试次数过期(默认情况下,这是 10 次重试,每次间隔 1 秒)。
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
是命令列表中的第一个命令,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
。