Можно ли установить Ansible факт, только если переменная имеет значение? - PullRequest
0 голосов
/ 21 июня 2019

У меня Ansible playbook, который я запускаю из AWX. Воспроизведение использует модуль Infoblox nios для получения информации о регистрациях хостов Infoblox.

Я использую модуль set_fact для получения результата запроса, а затем определяю ряд новых фактов, которые можно использовать в других местах книги.

Проблема, с которой я столкнулся, заключается в том, что запрос может возвращать различное количество переменных в зависимости от формата регистрации, и это нарушает playbook.

То, что я пытаюсь сделать, - это тренировка, если я могу установить новый факт, только если конкретная переменная возвращается в исходном запросе.

Я пытался использовать «если определено», но, похоже, это не сработало.

В примере 1 пьеса «Получить запись хоста» возвращает следующие значения. host, ipv4addr и mac, поскольку у хоста есть Mac-адрес в Infoblox

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 та же игра возвращает только хост и 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-адрес в качестве фактического хоста, не содержит значения для host.ipv4addrs [0] .mac, поэтому он вылетает. Я хотел бы добавить логику, чтобы попытаться установить 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 }}"

Вот версия, которую я пытался использовать, определена

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 голосов
/ 21 июня 2019

Извините, я должен был напечатать что-то неправильно, как я пытался снова, и теперь, кажется, работает.Вот правильный код для уточнения.

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