ansible jinja2 объединяет IP-адреса

Я хотел бы объединить группу ips в строку.

пример ip1:2181,ip2:2181,ip3:2181 и т. д.

{% for host in groups['zookeeper'] %}
   {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}
{% endfor %}

У меня есть приведенный выше код, но я не могу понять, как объединить его в строку.

поиск по запросу "Конкатенация Jinja2" не дает мне нужной информации.


person Simply Seth    schedule 30.01.2015    source источник


Ответы (3)


Обновлен этот ответ, потому что я думаю, что неправильно понял ваш вопрос.

Если вы хотите соединить IP-адреса каждого хоста с некоторой строкой, вы можете работать с элементами управления циклом, чтобы проверить, находитесь ли вы в последней итерации:

{% for host in groups['zookeeper'] -%}
   {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}
   {%- if not loop.last %}, {% endif -%}
{%- endfor %}

Старый ответ:

Искомое слово: join:

{{ hostvars[host]['ansible_eth0']['ipv4']['address'] | join(", ") }}
person udondan    schedule 30.01.2015
comment
Я отредактировал вопрос, потому что ошибся, упустив нужный номер порта. - person Simply Seth; 30.01.2015
comment
Откуда порт? Если это фиксированное значение или внутри другой переменной, просто добавьте его за выражением переменной: {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}:{{ port }} - person udondan; 30.01.2015
comment
порты являются фиксированными значениями - person Simply Seth; 31.01.2015

Для этого вы можете использовать фильтр 'extract' (при условии, что вы используете ansible>=2.1):

{{ groups['zookeeper'] | map('extract', hostvars, ['ansible_eth0', 'ipv4', 'address']) | join(',') }}

Дополнительная информация: http://docs.ansible.com/ansible/playbooks_filters.html#extracting-values-from-containers

person Def_Os    schedule 11.04.2016
comment
Это теперь доступно и определенно является улучшением по сравнению с другими возможностями. - person To마SE; 25.10.2016

Нашел похожее решение на https://adamj.eu/tech/2014/10/02/merging-groups-and-hostvars-in-ansible-variables/ .

Я сделал set_fact, используя переменную группы, как было предложено в сообщении:

- hosts: all
  connection: local
  tasks:
    - set_fact:
        fqdn_list: |
          {% set comma = joiner(",") %}
          {% for item in play_hosts -%}
              {{ comma() }}{{ hostvars[item].ansible_default_ipv4.address }}
          {%- endfor %}

Это зависит от столяра, преимущество которого заключается в том, что ему не нужно беспокоиться о последнем условном цикле. Затем с помощью set_fact я могу использовать новую строку в последующих задачах.

person saranicole    schedule 05.04.2016