Невозможно получить доступ к hostvars, когда инвентаризатор вставлен как переменная - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть шаблон jinja2, и я пытаюсь перебрать группу хостов и вставить адрес ipv4 всех хостов в мой шаблон.Но я получаю сообщение об ошибке, когда я делаю это, хотя способ, которым я делаю это, заключается в том, как каждый пост и статья предполагают, что это должно быть сделано.

Вот шаблон, который выдает ошибку:

{% if groups['linux-hosts'] %}
{% for item in groups['linux-hosts'] %}
define host {
    use                     generic-host-normal
    host_name               {{ item }}
    alias                   {{ item }}
    address                 {{ hostvars[item].ansible_default_ipv4.address }}
}
{% endfor %}
{% endif %}

И ошибка, которую я получаю:

не удалось: [сервер] (item = servers.cfg) => {"updated": false, "item":"servers.cfg", "msg": "AnsibleUndefinedVariable: 'объект ansible.vars.hostvars.HostVarsVars' не имеет атрибута ansible_default_ipv4 '"}

Если я не использую переменную item'в квадратных скобках, но вместо того, чтобы указать конкретный хост из инвентаря, Ansible может получить адрес ipv4.Пример («сервер» - это имя хоста из моего инвентаря):

{{ hostvars['server'].ansible_default_ipv4.address }}

1 Ответ

0 голосов
/ 03 декабря 2018

Это потому, что вам не хватает задания gather_facts: yes или эквивалентного - setup: в вашей книге игр;эти факты волшебным образом не появляются, если не запрошено, что происходит по умолчанию, но, конечно, можно отключить через gather_facts: no

. Простой тест покажет, что я имею в виду:

- hosts: all
  gather_facts: yes
  tasks:
  - debug: var=ansible_default_ipv4 verbosity=0

изатем измените gather_facts: no и наблюдайте за kaboom

...