Как поместить IP-адрес компьютера в конфигурационный файл HAProxy с помощью шаблона Jinja2 и Ansible?

#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 действительно собирает факты для всех необходимых хостов при запуске.