Ansible任务优化:为字典列表添加字段并过滤空值项
问题:Ansible处理JSON生成字典列表的两个需求
我正在从JSON文件中整理数据生成字典列表,已经完成文件解析,还需要完成两项操作:
- 为列表中的每个字典添加
package: item字段,item来自循环变量{{ packages_to_import }}(该变量是待处理文件路径列表); - 同一任务中过滤列表,移除包含null值的字典(避免后续任务大量跳过,影响输出可读性)。
当前任务代码
- name: "Read JSON files" set_fact: json_content: "{{ json_content | default([]) + ((lookup('file', item) | from_json ).transferDetails | json_query('[].{name: transferObject.summary.name, id: transferObject.summary.id, path: transferObject.contentSourceLocation}') | list }}" with_items: "{{ packages_to_import }}"
当前生成的字典列表
ok: [localhost] => { "msg": [ { "id": "123456789", "name": "filename1", "path": null }, { "id": "1234567", "name": "filename2", "path": "/folder1/folder2" }, { "id": "1234567", "name": "filename3", "path": "folder1" } ] }
期望得到的结果
ok: [localhost] => { "msg": [ { "id": "1234567", "name": "filename2", "path": "/folder1/folder2", "package": "/folder1/folder2/file2" }, { "id": "1234567", "name": "filename3", "path": "folder1", "package": "/folder1/file3" } ] }
补充:packages_to_import结构
ok: [localhost] => { "msg": [ "/path_to_file1/file1.json", "/path_to_file1/file2.json", "/path_to_file1/file3.json" ] }
解决方案
直接修改json_query部分,同时完成过滤和字段添加:
- name: "Read JSON files" set_fact: json_content: "{{ json_content | default([]) + ((lookup('file', item) | from_json ).transferDetails | json_query('[?path != null].{name: transferObject.summary.name, id: transferObject.summary.id, path: transferObject.contentSourceLocation, package: `{{ item }}`}') | list }}" with_items: "{{ packages_to_import }}"
关键修改说明:
- 过滤null值:在json_query开头加上
[?path != null],直接筛选出path字段不为null的条目; - 添加package字段:在构造字典的部分加入
package:{{ item }}``,把当前循环的文件路径(即packages_to_import中的每个元素)作为package字段的值; - 整个逻辑在一步中完成,不需要额外任务处理,效率更高。
内容的提问来源于stack exchange,提问作者Lucifer
相关产品推荐
相关产品推荐

