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

У меня есть следующая книга воспроизведения в AWX, которая ищет хосты Infoblox на основе их Mac-адреса, а затем выводит информацию в более удобном для пользователя формате.

Текущая книга воспроизведения работает при условии, что один хост с таким Mac-адресом существует, но не работает, если их несколько.

---
- hosts: localhost
  connection: local

  vars:
    niosip: ""
    niosmac: ""
    niosdhcp: ""
    nioshostname: ""
    niossearchcatagory: "{{ 'name' if searchcatagory == 'Hostname' else 'ipv4addr' if searchcatagory == 'IP Address' else 'mac' if searchcatagory == 'Mac Address'}}"

  pre_tasks:
    - include_vars: 
        file: creds.yml

  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 != [] 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

    - name: Host not found
      debug:
        msg: 'Cant find related host'
      when: host == []

    - name: Display Display Registration Info
      debug:
        msg:
        - Hostname = {{ nioshostname }}
        - IP = {{ niosip }}
        - Mac Address {{ niosmac }}
        - Registered for DHCP = {{ niosdhcp }}
      when: host != [] and host.ipv4addrs[0].mac is defined

Переменные niossearchcatagory и критерии поиска передаются в сборник пьес с помощью опроса AWX.

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

Если выходные данные совпадают, тогда книга воспроизведения работает как положено

{
    "changed": false,
    "ansible_facts": {
        "host": [
            {
                "_ref": "record:host/ZG5zLmhvc3QkLl9kZWZhdWx0LnVrLmFjLmJoYW0udGVzdC5zbmF0LWF3eHRlc3Q1:snat-awxtest5.test.com/Internal",
                "ipv4addrs": [
                    {
                        "_ref": "record:host_ipv4addr/ZG5zLmhvc3RfYWRkcmVzcyQuX2RlZmF1bHQudWsuYWMuYmhhbS50ZXN0LnNuYXQtYXd4dGVzdDUuMTQ3LjE4OC4zMS40Lg:192.168.31.4/snat-awxtest5.test.com/Internal",
                        "configure_for_dhcp": false,
                        "host": "snat-awxtest5.test.com",
                        "ipv4addr": "192.168.31.4",
                        "mac": "10:20:30:40:50:60"
                    }
                ],
                "name": "snat-awxtest5.test.com",
                "view": "Internal"
            },
        ]
    },
    "_ansible_no_log": false
}

И вот пример игры, возвращающей несколько значений

{
    "changed": false,
    "ansible_facts": {
        "host": [
            {
                "_ref": "record:host/ZG5zLmhvc3QkLl9kZWZhdWx0LnVrLmFjLmJoYW0udGVzdC5zbmF0LWF3eHRlc3Q1:snat-awxtest5.test.com/Internal",
                "ipv4addrs": [
                    {
                        "_ref": "record:host_ipv4addr/ZG5zLmhvc3RfYWRkcmVzcyQuX2RlZmF1bHQudWsuYWMuYmhhbS50ZXN0LnNuYXQtYXd4dGVzdDUuMTQ3LjE4OC4zMS40Lg:192.168.31.4/snat-awxtest5.test.com/Internal",
                        "configure_for_dhcp": false,
                        "host": "snat-awxtest5.test.com",
                        "ipv4addr": "192.168.31.4",
                        "mac": "10:20:30:40:50:60"
                    }
                ],
                "name": "snat-awxtest5.test.com",
                "view": "Internal"
            },
            {
                "_ref": "record:host/ZG5zLmhvc3QkLl9kZWZhdWx0LnVrLmFjLmJoYW0udGVzdC5zbmF0LW15d2Vi:snat-myweb.test.com/Internal",
                "ipv4addrs": [
                    {
                        "_ref": "record:host_ipv4addr/ZG5zLmhvc3RfYWRkcmVzcyQuX2RlZmF1bHQudWsuYWMuYmhhbS50ZXN0LnNuYXQtbXl3ZWIuMTQ3LjE4OC4zMS4yLg:192.168.31.2/snat-myweb.test.com/Internal",
                        "configure_for_dhcp": false,
                        "host": "snat-myweb.test.com",
                        "ipv4addr": "192.168.31.2",
                        "mac": "10:20:30:40:50:60"
                    }
                ],
                "name": "snat-myweb.test.com",
                "view": "Internal"
            },
            {
                "_ref": "record:host/ZG5zLmhvc3QkLl9kZWZhdWx0LnVrLmFjLmJoYW0udGVzdC5zbmF0LXdlYg:snat-web.test.com/Internal",
                "ipv4addrs": [
                    {
                        "_ref": "record:host_ipv4addr/ZG5zLmhvc3RfYWRkcmVzcyQuX2RlZmF1bHQudWsuYWMuYmhhbS50ZXN0LnNuYXQtd2ViLjE0Ny4xODguMzEuMy4:192.168.31.3/snat-web.test.com/Internal",
                        "configure_for_dhcp": false,
                        "host": "snat-web.test.com",
                        "ipv4addr": "192.168.31.3",
                        "mac": "10:20:30:40:50:60"
                    }
                ],
                "name": "snat-web.test.com",
                "view": "Internal"
            }
        ]
    },
    "_ansible_no_log": false
}

И это приводит к ошибке, поскольку переменные host.name, host.ipv4addrs и т. Д. Не существуют, что, как я полагаю, связано с тем, что есть кратные значения.

Любая помощь по выводу каждой регистрации будет принята с благодарностью.

...