我想将一组ips共同放入一个字符串中。
示例ip1:2181,ip2:2181,ip3:2181等
{% for host in groups['zookeeper'] %}
{{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}
{% endfor %}
我有上面的代码,但似乎无法弄清楚如何连接成一个字符串。
搜索" Jinja2连接" 并没有向我提供我需要的信息。
答案 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,我可以在以后的任务中使用新字符串。