【问题标题】:ansible jinja2 concatenate IP addressesansible jinja2 连接 IP 地址
【发布时间】:2015-03-29 16:36:10
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: jinja2 ansible ansible-playbook


    【解决方案1】:

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

    如果您想将每个主机的 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(", ") }}
    

    【讨论】:

    • 我编辑了问题,因为我遗漏了所需的端口号。
    • 端口从何而来?如果它是固定值或在另一个 var 中,只需将其添加到 var 表达式后面:​​{{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}:{{ port }}
    • 端口是固定值
    【解决方案2】:

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

    【讨论】:

    • 现在可以使用,绝对是对其他可能性的改进。
    【解决方案3】:

    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 %}
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-22
      • 2021-01-18
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多