如何让.stdout_lines / array中的每一行都匹配一个变量

时间:2019-08-21 19:53:40

标签: ansible

我正在尝试编写Ansible剧本。需要帮助编写任务之一。如何在名为CONF T的任务中正确编写“ when:”?

我的其中一个寄存器将包含一个数组:

{
    "current_ntp_servers.stdout_lines": [
        "ntp server 10.190.248.248",
        "ntp server 10.190.248.8",
        "ntp server 10.190.248.16",
        "ntp server 10.190.248.1",
        "ntp server 10.190.248.9",
        "ntp server 10.190.248.17",
        "ntp server 10.190.248.2",
        "ntp server 10.190.248.10",
        "ntp server 10.190.248.34",
        "ntp server 10.190.248.98",
        "ntp server 10.190.248.18",
        "ntp server 10.180.248.3"
    ]
}

我还有一个预定义的变量:

vars:
    ntp_server: "ntp server 10.190.248.248"

我希望当数组中的任何项目与预定义变量都不匹配时运行任务。但是,变量CAN可以匹配数组中的任何行,并且如果其他行不匹配,则仍需要运行任务。

即使数组中存在ntp_server,如果其他数组项不匹配,我仍然需要运行任务。因此,我必须通过使用数组项并检查每个项是否与ntp_server匹配来进行匹配。如果不匹配,请运行任务。但是,即使有多个不匹配项,任务也只需运行一次。

名为“ CONF T”的任务和关联的“ when:”对我不起作用。名为“删除ntp服务器”的任务可以正常工作。

---

- hosts: switches
  gather_facts: false
  connection: network_cli
  vars:
    ntp_server: "ntp server 10.190.248.248"


  tasks:
    - name: "sh run | s ntp server"
      cli_command:
        command: sh run | s ntp server
      register: current_ntp_servers

    - name: THESE ARE THE CURRENT NTP SERVERS CONFIGURED ON THIS DEVICE BEFORE ANY CHANGES
      debug:
        var: current_ntp_servers.stdout_lines

    - name: REMOVE NTP SERVERS CONF T
      block:
        - name: CONF T
          when: "(current_ntp_servers.stdout_lines not in ntp_server)"
          cli_command:
            command: conf t
          register: conf_t
        - debug:
            var: conf_t
        - name: remove ntp servers
          with_items: "{{ current_ntp_servers.stdout_lines }}"
          when: "(item != ntp_server)"
          cli_command:
            command: "no {{item}}"
          register: remove_ntp_output.stdout_lines

Ansible对我来说是新的。我是一名拥有10年经验的网络工程师,但是没有编码经验。

1 个答案:

答案 0 :(得分:1)

  

Q:“我希望当数组中的任何项目与预定义变量都不匹配时运行任务。”

以下条件可以完成工作

- debug:
    msg: This task will run
  when: current_ntp_servers.stdout_lines|                           
        reject('match', ntp_server)|
        list|
        length > 0
可以根据用途将

测试 match 更改为 equalto search 情况。