如何用Ansible嵌套循环列表生成指定结构的字典集合
问题描述
现有如下Ansible变量:
result: results: - ansible_loop_var: item item: /bigdata/gidn/data/input/datalake/test_workspace_3 stdout: |2- snapshot_input stdout_lines: - '' - snapshot_input - ansible_loop_var: item item: /bigdata/gidn/data/output/datalake/test_workspace_3 stdout: |2- snapshot_output stdout_lines: - '' - snapshot_output - ansible_loop_var: item item: /bigdata/gidn/projets/datalake/test_workspace_3 stdout: |2- snapshot_projet_1 snapshot_projet_2 stdout_lines: - '' - snapshot_projet_1 - snapshot_projet_2
需要遍历result.results中的每个条目,并对每个条目的stdout_lines进行二次遍历,最终生成如下格式的字典集合:
{'path': '/bigdata/gidn/data/input/datalake/test_workspace_3', 'id':'snapshot_input'}, {'path': '/bigdata/gidn/data/output/datalake/test_workspace_3', 'id':'snapshot_output'}, {'path': '/bigdata/gidn/projets/datalake/test_workspace_3', 'id':'snapshot_projet_1'}, {'path': '/bigdata/gidn/projets/datalake/test_workspace_3', 'id':'snapshot_projet_2'}
解决方案
可以使用Ansible的set_fact模块结合嵌套循环实现需求,示例Playbook代码如下:
- name: 生成目标字典集合 set_fact: target_list: "{{ target_list | default([]) + [{'path': outer_item.item, 'id': line}] }}" loop: "{{ outer_item.stdout_lines }}" loop_control: loop_var: line when: line != '' with_items: "{{ result.results }}" loop_control: loop_var: outer_item
代码说明
- 外层循环遍历
result.results中的每个条目,用outer_item作为循环变量 - 内层循环遍历当前条目的
stdout_lines,用line作为循环变量 - 通过
when条件过滤掉空字符串条目 - 将符合条件的
path(对应outer_item.item)和id(对应非空的line)组成字典,追加到target_list变量中
执行完成后,target_list变量即为所需的字典集合。
内容的提问来源于stack exchange,提问作者anis
相关产品推荐
相关产品推荐

