仅当变量具有值时才可以设置Ansible事实吗?

时间:2019-06-20 21:28:55

标签: ansible yaml ansible-facts ansible-awx

我有一本正在AWX上运行的Ansible剧本。播放使用Infoblox nios模块检索有关Infoblox主机注册的信息。

我正在使用set_fact模块获取查询的输出,然后定义一些新的事实,以便在剧本的其他地方使用

我遇到的问题是,查询可以根据注册的格式返回不同数量的变量,这会破坏剧本。

如果只有在原始查询中返回了特定变量的情况下,我才可以设置新的事实,我想做的就是锻炼。

我尝试使用“如果已定义”,但这似乎不起作用。

在示例1中,播放“获取主机记录”返回以下值。主机,ipv4addr和mac作为主机,在Infoblox中具有Mac地址

ok: [localhost] => {
    "ansible_facts": {
        "host": {
            "ipv4addrs": [
                {
                    "host": "myhost1.test.com",
                    "ipv4addr": "192.168.30.1",
                    "mac": "00:22:33:11:44:55"
                }
            ],
            "name": "myhost1.test.com",
            "view": "Internal"
        }
    },
    "changed": false
}

在示例2中,同一播放仅返回host和ipv4addr,因为该主机未注册Mac地址。

ok: [localhost] => {
    "ansible_facts": {
        "host": {
            "ipv4addrs": [
                {
                    "host": "myhost2.test.com",
                    "ipv4addr": "192.168.30.2"
                }
            ],
            "name": "myhost2.test.com",
            "view": "Internal"
        }
    },
    "changed": false
}

我的剧本包含以下内容,并且仅在主机包含Mac Address作为事实主机且不包含host.ipv4addrs [0] .mac的值时才起作用,因此它崩溃了。我想添加一些逻辑,仅在定义host.ipv4addrs [0] .mac时尝试设置niosmac。

  tasks:
    - name: fetch host record
      set_fact:
        host: "{{ lookup('nios', 'record:host', filter={niossearchcatagory: searchcriteria, 'view': 'Internal'}, provider=nios_provider) }}"

    - name: Set niosip
      set_fact:
        niosip: "{{ host.ipv4addrs[0].ipv4addr }}"
        nioshostname: "{{ host.name }}"
        niosdhcp: "{{ host.ipv4addrs[0].configure_for_dhcp }}"
        niosmac: "{{ host.ipv4addrs[0].mac }}"

这是我尝试使用的版本已定义

tasks:
    - name: fetch host record
      set_fact:
        host: "{{ lookup('nios', 'record:host', filter={niossearchcatagory: searchcriteria, 'view': 'Internal'}, provider=nios_provider) }}"
    - name: Set niosip
      set_fact:
        niosip: "{{ host.ipv4addrs[0].ipv4addr }}"
        nioshostname: "{{ host.name }}"
        niosdhcp: "{{ host.ipv4addrs[0].configure_for_dhcp }}"
        niosmac: "{{ host.ipv4addrs[0].mac }}"
      when: host.ipv4addrs[0].mac is defined

欢呼 斯彭斯

1 个答案:

答案 0 :(得分:0)

对不起,我必须再次输入错误,因为我再次尝试过,它现在似乎可以正常工作。这是用于澄清的正确代码。

- name: Set niosip
  set_fact:
    niosip: "{{ host.ipv4addrs[0].ipv4addr }}"
    nioshostname: "{{ host.name }}"
    niosdhcp: "{{ host.ipv4addrs[0].configure_for_dhcp }}"
    niosmac: "{{ host.ipv4addrs[0].mac }}"
  when: host != [] and host.ipv4addrs[0].mac is defined

- name: Set niosip
  set_fact:
    niosip: "{{ host.ipv4addrs[0].ipv4addr }}"
    nioshostname: "{{ host.name }}"
    niosdhcp: "{{ host.ipv4addrs[0].configure_for_dhcp }}"
  when: host != [] and host.ipv4addrs[0].mac is undefined