You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 }}"

关键修改说明:

  1. 过滤null值:在json_query开头加上[?path != null],直接筛选出path字段不为null的条目;
  2. 添加package字段:在构造字典的部分加入package: {{ item }}``,把当前循环的文件路径(即packages_to_import中的每个元素)作为package字段的值;
  3. 整个逻辑在一步中完成,不需要额外任务处理,效率更高。

内容的提问来源于stack exchange,提问作者Lucifer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:40:24