一种解决此问题的方法是使用 Jinja2
模板语言的过滤器 json_query
将变量文件中的字典转换为列表,然后进行循环遍历,示例如下:
# vars.yml
my_vars:
- name: foo
properties:
- key: color
value: red
- key: size
value: large
- name: bar
properties:
- key: color
value: blue
- key: size
value: medium
# playbook.yml
- hosts: localhost
vars_files:
- vars.yml
tasks:
- debug:
msg: "{{ item.1.key }}: {{ item.1.value }}"
loop: "{{ my_vars | json_query('[].properties[]') | list }}"
loop_control:
loop_var: item
该 playbook 循环遍历变量文件中的 my_vars
列表并将 properties
字典转换为列表后再进行循环遍历,输出结果如下:
TASK [debug] ******************************************************************
ok: [localhost] => (item=None) => {
"msg": "color: red"
}
ok: [localhost] => (item=None) => {
"msg": "size: large"
}
ok: [localhost] => (item=None) => {
"msg": "color: blue"
}
ok: [localhost] => (item=None) => {
"msg": "size: medium"
}
这样就成功地遍历了字典中的子元素。