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
相关产品推荐
相关产品推荐

