ansible jinja2 连接 IP 地址

ansible jinja2 concatenate IP addresses

我想将一组 ips 连接成一个字符串。

示例ip1:2181、ip2:2181、ip3:2181等

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

我有上面的代码,但似乎不太明白如何连接成一个字符串。

搜索 "Jinja2 concatenate" 没有提供我需要的信息。

更新了这个答案,因为我想我误解了你的问题。

如果您想将每个主机的 IP 与一些字符串连接起来,您可以使用 loop controls,检查您是否在最后一次迭代中:

{% 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(", ") }}

https://adamj.eu/tech/2014/10/02/merging-groups-and-hostvars-in-ansible-variables/ 找到了类似的解决方案。

我按照 post:

中的建议使用组变量进行了 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 %}

这依赖于joiner,它的优点是不用担心最后一个循环条件。然后 set_fact 我可以在以后的任务中使用新字符串。

您可以为此使用 '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