如何在 jinja2 模板中构建这个循环

how to contruct this loop in jinja2 template

我有一个后续任务

---
- name: Add inventory hosts to hosts file
  template: src=hosts.j2 dest=/etc/hosts owner=root group=root mode=0644
  with_dict: hosts

jinja 模板看起来像这样

{% for host in hosts %}

{{ host }}{% for domain in item.value.domains %} {{ host }}.{{ domain }}{% endfor %}{% if item.value.alias is defined %}{% for domain in item.value.domains %} {{ item.value.alias }}.{{ domain }}{% endfor %}{% endif %}

{% endfor %}

hosts 字典所在的位置

主机:

  'server1':
    domains:
      - 'com'
      - 'net'
    alias: 'opendj'
  'server2':
    domains:
      - 'org'
    alias: 'metadata'

我得到

server1 server1.org metadata.org
server2 server2.org metadata.org

我应该怎么做才能达到正确的状态,即

server1 server1.com server1.net opendj.com opendj.net
server2 server2.org metadata.org

谢谢

这看起来会做你想做的事:

{% for host in hosts %}
{{ host }} {% for d in hosts[host]['domains'] %} {{ host }}.{{ d }}{% endfor %} {% for d in hosts[host]['domains'] %} {{ hosts[host]['alias'] }}.{{ d }}{% endfor %}

{% endfor %}

或者,如果您想要稍微漂亮一点的版本:

{% for host in hosts %}
{{ host -}}
{% for d in hosts[host]['domains'] %} {{ host }}.{{ d }}{% endfor -%}
{% for d in hosts[host]['domains'] %} {{ hosts[host]['alias'] }}.{{ d }}{% endfor %}
{% endfor %}

{{ host -}}{% endfor -%} 语句末尾的 - 将取消尾随的换行符,否则会出现在这些位置。

并且如果您只想打印出定义了 alias 的别名:

{% for host in hosts %}
{{ host -}}
{% for d in hosts[host]['domains'] %} {{ host }}.{{ d }}{% endfor -%}
{% if hosts[host]['alias'] is defined %}
{% for d in hosts[host]['domains'] %} {{ hosts[host]['alias'] }}.{{ d }}{% endfor %}
{% endif %}

{% endfor %}