如何使用Jinja2过滤器扁平化Ansible结果并提取所有子元素?
Ansible中用Jinja2过滤器合并嵌套列表
针对你需要合并多个嵌套子列表的需求,用Jinja2的map和flatten两个过滤器就能搞定,不需要嵌套循环。
先看你的示例数据场景
对于你给出的results数组,要提取所有元素中c的子元素并合并成一个列表,过滤器写法如下:
{{ results | map(attribute='c') | flatten }}
map(attribute='c'):遍历results里的每个字典,把每个字典的c字段(也就是子列表)提取出来,得到一个包含多个子列表的新列表flatten:把这个嵌套的列表结构“拍平”,变成一个包含所有子元素的单层列表
再适配你的实际find模块场景
你的oldLogs.results里,每个元素是find模块返回的结果,其中files字段存储了对应路径下找到的文件列表。要把所有路径下的文件合并成一个列表,修改后的debug任务如下:
- name: print files debug: msg: "{{ oldLogs.results | map(attribute='files') | flatten }}"
如果还需要提取文件的具体属性(比如文件路径),可以再加一层map过滤器:
- name: print file paths debug: msg: "{{ oldLogs.results | map(attribute='files') | flatten | map(attribute='path') | list }}"
内容的提问来源于stack exchange,提问作者ataraxis
相关产品推荐
相关产品推荐

