在遍历Jinja模板时,是否可以引用作为“ item”传递的变量并使用它们的元素?

时间:2019-11-09 03:14:04

标签: ansible jinja2

当尝试在ansible中循环遍历变量时,在构建jinja2模板时,传递变量后,我似乎无法引用变量中的元素。

我尝试了几种排列,但很茫然,这很简单,但我看不到。

有问题的Yaml:

---
- name: testing some crazyness
  hosts: localhost
  vars:
    domdb:
      dom1:
        ip: something
        mail: somethingelse
      dom2:
        ip: somethingdifferent
        mail: somethingelsedifferent
  tasks:
  - name:
    template:
      src: test.j2
      dest: "{{ item }}"
    with_items: "{{ domdb }}"  

模板:

{{ item.ip. }}
{{ item.mail }}

我希望它能输出两个文件: dom1,包含: 某事 其他

和dom2,其中包含: 有些不同 有点不同

2 个答案:

答案 0 :(得分:0)

domdb是字典,而不是列表。如果尝试遍历字典,则仅遍历键。因此,您的任务等同于:

  - template:
      src: test.j2
      dest: "{{ item }}"
    with_items:
      - dom1
      - dom2

您尝试在任务中使用item.ipitem.mail的情况下会导致显示AnsibleUndefinedVariable错误消息。您可能想要这样:

---
- name: testing some crazyness
  hosts: localhost
  vars:
    domdb:
      - name: dom1
        ip: something
        mail: somethingelse
      - name: dom2
        ip: somethingdifferent
        mail: somethingelsedifferent
  tasks:
    - name:
      template:
        src: test.j2
        dest: "{{ item.name }}"
      loop: "{{ domdb }}"  

在此示例中,domdb是一个列表。您也可以选择这样做:

---
- name: testing some crazyness
  hosts: localhost
  vars:
    domdb:
      dom1:
        ip: something
        mail: somethingelse
      dom2:
        ip: somethingdifferent
        mail: somethingelsedifferent
  tasks:
    - template:
        src: test.j2
        dest: "{{ item.0 }}"
      loop: "{{ domdb.items()|list }}"

在这里,domdb再次是字典,但是使用字典.items()方法生成(key, value)元组的列表。

在以上两个示例中,我都用with_items替换了旧版loop

答案 1 :(得分:0)

使用dict2items迭代字典。例如

- name:
  template:
    src: test.j2
    dest: "{{ item.key }}"
  loop: "{{ domdb|dict2items }}"

模板:

{{ item.value.ip }}
{{ item.value.mail }}