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

Ansible中如何从嵌套字典列表按集群条件提取tag值

如何用Ansible的json_query提取关联特定集群的tag值

问题描述

现有指定结构的JSON数据,需要提取与特定集群(如cluster1)关联的tag值——即判断cluster1是否存在于clusters[*].name列表中,进而获取对应的tag。编写的Ansible Playbook使用json_query后得到空结果,预期结果应为tag值"a"。

目标JSON数据

[
   {
      "clusters":[
         {
            "id":"1",
            "name":"cluster1"
         },
         {
            "id":"2",
            "name":"cluster2"
         }
      ],
      "tag":"a"
   },
   {
      "clusters":[
         {
            "id":"3",
            "name":"cluster2"
         }
      ],
      "tag":"b"
   }
]

原Playbook代码

- name: "Test"
  hosts: localhost
  gather_facts: False

  vars:
  - test:
        - clusters:
            - name: "cluster1"
              id: "1"
            - name: "cluster2"
              id: "2"
          tag: "a"
        - clusters:
            - name: "cluster2"
              id: "3"
          tag: "b"

  - set_fact:
      tags_test: "{{ test | community.general.json_query('[?clusters[].name==`cluster1`].tag') }}"

  - debug:
      msg: "{{ tags_test }}"

原执行结果

TASK [debug] ******************************************************
ok: [localhost] => {
    "msg": []
}

解决方案

方法1:修正json_query表达式

原表达式失效的原因是:clusters[].name会返回一个数组(比如第一个元素的结果是["cluster1", "cluster2"]),直接用==和字符串cluster1比较无法匹配,需要用contains函数检查数组中是否包含目标值。

修改后的set_fact任务:

- set_fact:
    tags_test: "{{ test | community.general.json_query('[?contains(clusters[].name, `cluster1`)].tag') }}"

执行后得到预期结果:

TASK [debug] ******************************************************
ok: [localhost] => {
    "msg": [
        "a"
    ]
}

方法2:使用原生过滤器组合(无需json_query)

如果不想依赖json_query模块,可使用Ansible原生过滤器实现:

- set_fact:
    tags_test: "{{ test | selectattr('clusters', 'any', 'name', 'cluster1') | map(attribute='tag') | list }}"
  • selectattr('clusters', 'any', 'name', 'cluster1'):筛选出clusters列表中存在name为cluster1的元素
  • map(attribute='tag'):提取这些元素的tag属性
  • list:将结果转为列表格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:10:32