在网络模块中使用命令输出和提示

网络模块中的条件语句

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_commandcisco.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_forwait_for_connectionprompt 的网络设备示例。

深入了解 cli_command

有关如何使用 cli_command 的详细概述。