Неопределенная переменная hostvars при отладке / создании шаблонов и т. Д.

Я пытаюсь динамически сгенерировать часть файла / etc / hosts с помощью ansible, собирая факты со всех хостов и перебирая полученный hostvars, чтобы получить IP-адрес второго интерфейса (мне нужен частный IP-адрес на этом интерфейсе, скорее чем публичный IP другого интерфейса)

Я могу получить эту информацию с одного хоста, используя следующие игры:

- name: play 1
  hosts: all

- name: play 2
  hosts: localhost
  connection: local
  become: no
  tasks:
   - debug:
        var: hostvars['mysinglehost'].ansible_all_ipv4_addresses[1]

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

Я пытался

...
  - debug:
      var: hostvars[item].ansible_all_ipv4_addresses[1]
    with_inventory_hostnames:
      - all
...

... который дает результат, которого я ожидаю, но когда я пытаюсь вывести msg с помощью этой задачи отладки:

...
  - debug:
      msg: "{{ hostvars[item].ansible_all_ipv4_addresses[1] }}"
    with_inventory_hostnames:
      - all
...

Я получаю следующую ошибку (как и при попытке, например, записи в файл с помощью lineinfile):

fatal: [localhost]: FAILED! => 
  msg: |-
    The task includes an option with an undefined variable. The error was: 'ansible.vars.hostvars.HostVarsVars object' has no attribute 'ansible_all_ipv4_addresses'

Я не уверен, почему это происходит, поскольку он пытается ссылаться на ту же самую переменную. Есть ли способ сделать это?


person ticktockhouse    schedule 07.03.2021    source источник
comment
Можете ли вы опубликовать полную книгу, в которой воспроизводится проблема? Основываясь на вашем описании здесь, я попробовал эту инструкцию, и она работает в моих системах без каких-либо ошибок.   -  person larsks    schedule 08.03.2021
comment
Я попробовал вашу книгу и получил ту же ошибку. Работает при использовании var, не работает с этой ошибкой при использовании msg и фигурных скобок. Мне интересно, ошибка ли это в используемой мной версии Ansible (2.10.5)   -  person ticktockhouse    schedule 09.03.2021
comment
Тестировал на 2.9. что-то. Позвольте мне взять 2.10.5 и взглянуть ...   -  person larsks    schedule 09.03.2021
comment
Я не могу воспроизвести вашу проблему. Опубликованный мной сборник игр отлично работает с ansible 2.10.5 и ansible 2.10.6.   -  person larsks    schedule 09.03.2021
comment
Какая целевая ОС машины дает сбой? Если Linux, доступна ли команда ip? Сегодня у меня была такая же проблема с докер-контейнером centos 7, и я обнаружил, что не получу никаких сетевых фактов без этой доступной команды. См. сборщик фактов. Установка iproute (предоставление ip на centos 7) устранила проблему.   -  person Zeitounator    schedule 10.03.2021
comment
@Zeitounator, я подтвердил, что на этих машинах есть команда ip. Я думаю, проблема связана с попыткой разобрать hostvars. Я начинаю думать, что, может быть, я нашел ошибку ..?   -  person ticktockhouse    schedule 14.03.2021
comment
Проблема определенно в том, что в ваших фактах не возвращается ansible_all_ipv4_addresses для этого конкретного хоста. Вы можете легко подтвердить это, запустив - debug: var=ansible_all_ipv4_addresses в своей первой игре, которая вернет undefinied. Затем вы должны понять, почему (например, этот хост имеет только соединение ipv6, пользователь, выполняющий установку, не имеет доступа к этой информации и т. Д.)   -  person Zeitounator    schedule 14.03.2021


Ответы (1)


Я не тестировал это, но в принципе, возможно, это сработает?

- hosts: all

- hosts: localhost
  gather_facts: false
  tasks:
  - set_fact:
      my_hosts: |
        {
          {% for a_host in hostvars | dict2items %}
            "{{ a_host.key }}": "{{ a_host.value.ansible_all_ipv4_addresses[1] }}",
          {% endfor %}
        }

Затем вместо того, чтобы перебирать hostvars, вы просто перебираете my_hosts?

person JonTheNiceGuy    schedule 09.03.2021
comment
Извини, Джон, я все еще получаю ansible.vars.hostvars.HostVarsVars object' has no attribute - я действительно пробовал с чем-то, что тоже должно возвращать одно значение - ansible_architecture, и получить ту же ошибку :( - person ticktockhouse; 14.03.2021