ansible jinja2连接IP地址

时间:2015-01-30 08:22:55

标签: jinja2 ansible ansible-playbook

我想将一组ips共同放入一个字符串中。

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

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

我有上面的代码,但似乎无法弄清楚如何连接成一个字符串。

搜索" Jinja2连接" 并没有向我提供我需要的信息。

3 个答案:

答案 0 :(得分:12)

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

如果你想用一些字符串连接每个主机的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(", ") }}

答案 1 :(得分:10)

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

答案 2 :(得分:5)

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

我使用group变量做了一个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,我可以在以后的任务中使用新字符串。