当尝试在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,其中包含: 有些不同 有点不同
答案 0 :(得分:0)
domdb
是字典,而不是列表。如果尝试遍历字典,则仅遍历键。因此,您的任务等同于:
- template:
src: test.j2
dest: "{{ item }}"
with_items:
- dom1
- dom2
您尝试在任务中使用item.ip
和item.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 }}