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
我想将一组 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