在网络模块中使用命令输出和提示
网络模块中的条件语句
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 次重试)。
命令模块还可以评估接口中多个命令结果集。例如
---
- 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
的详细概述。