#ansible #jinja2 #ansible-inventory
#ansible #jinja2 #ansible-инвентаризация
Вопрос:
У меня есть некоторое недопонимание Ansible hostvars. Я выполняю задание шаблона из моего сборника воспроизведения для 3 хостов, файл инвентаря приведен ниже. Вот задача playbook:
- name: Template a HAProxy config
template:
src: ./haproxy.cfg.j2
dest: /etc/haproxy/haproxy.cfg
owner: root
group: root
mode: '0644'
Это мой пример файла инвентаризации:
server10 ansible_host=192.168.70.15
server20 ansible_host=192.168.70.20
server30 ansible_host=192.168.70.25
[servergroup]
server10
server20
server30
И это часть моего *.j2
конфигурационного файла:
{% for host in hostvars %}
server {{ host }} {{ ansible_default_ipv4.address }}
{% endfor %}
Я хочу получить что-то вроде этого:
server server10 192.168.70.15
server server20 192.168.70.20
server server30 192.168.70.25
Вот в чем проблема — я получаю что-то вроде этого:
server server10 192.168.70.15
server server30 192.168.70.15
server server10 192.168.70.15
Как правильно использовать переменную IP?
Ответ №1:
ansible_default_ipv4.address
является ли ip4-адрес хоста, на котором вы в данный момент запускаете задачу, по умолчанию, т.е. server10
если я верю вашему примеру инвентаризации.
Если вам нужны факты с другого хоста, вам нужно найти их через hostvars
magic dictionary. Смотрите соответствующий раздел в руководстве fine для получения дополнительной информации.
В вашем случае вы можете исправить свой шаблон следующим образом:
{% for host in hostvars %}
server {{ host }} {{ hostvars[host].ansible_default_ipv4.address }}
{% endfor %}
Пожалуйста, обратите внимание, что он ansible_default_ipv4
будет существовать только для определенного, host
если вы ранее собрали факты для этого хоста.
В качестве альтернативы, вы могли бы использовать информацию, уже зарегистрированную в вашем инвентаре, без необходимости собирать факты в этом случае:
{% for host in groups['servergroup'] %}
server {{ host }} {{ hostvars[host].ansible_host }}
{% endfor %}
Комментарии:
1. Ошибка. gather_facts: да <код>»AnsibleUndefinedVariable: ‘ansible.vars.hostvars.hostvars. Объект HostVarsVars’ не имеет атрибута ‘ansible_default_ipv4′»</code>
2. Я не могу воспроизвести вашу проблему. Какая версия ansible у вас установлена? Попробуйте заменить на
hostvars[host].ansible_facts.default_ipv4.address
. Если это по-прежнему не удается, трижды проверьте, что ваш playbook действительно собирает факты для всех необходимых хостов при запуске.