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

网络模块中的条件语句

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_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