如何用json_query过滤JSON文件中指定GroupName对应的EntryTitle
Ansible 使用 json_query 过滤指定 GroupName 对应的 EntryTitle
问题分析
你的JSON数据顶层是键值对结构,直接用*.GroupName只能提取所有分组名,但无法实现过滤指定Group并关联EntryTitle的需求。需要先将顶层对象的所有值转换为数组,再进行条件过滤。
修正后的Ansible Playbook
- name: 加载JSON数据 set_fact: jsondata: "{{ lookup('file', 'entries.json') | from_json }}" - name: 筛选TEST2对应的EntryTitle set_fact: servername: "{{ jsondata | json_query(jq_filter) }}" vars: jq_filter: "[*] | [?GroupName == 'TEST2'].EntryTitle" - name: 打印结果 debug: msg: "匹配的EntryTitle: {{ servername[0] }}"
关键说明
- 数据格式转换:
[*]将顶层对象的所有值转为数组,让json_query可以对元素进行遍历和过滤。 - 条件过滤:
[?GroupName == 'TEST2']筛选出数组中GroupName等于TEST2的元素。 - 提取目标字段:
.EntryTitle从过滤后的元素中提取需要的EntryTitle值。 - 结果处理:过滤后返回的是数组,用
servername[0]直接获取唯一匹配的结果(若有多个匹配可循环遍历)。
替代方案(无需json_query)
如果不想依赖json_query,也可以用Ansible原生过滤器实现:
- name: 用原生过滤器提取目标值 set_fact: servername: "{{ jsondata | dict2items | selectattr('value.GroupName', 'equalto', 'TEST2') | map(attribute='value.EntryTitle') | first }}" - name: 打印结果 debug: msg: "{{ servername }}"
内容的提问来源于stack exchange,提问作者scapy
相关产品推荐
相关产品推荐

