JMESPath多条件查询无结果求助(Ansible+Infoblox场景)
问题描述
我正尝试使用Ansible和JMESPath的json_query查询Infoblox返回的JSON数据,需求是获取_ref字段包含fixedaddress且匹配指定IP的记录的_ref值(可能存在多个含fixedaddress但IP不同的记录,需同时筛选特定IP)。
原始JSON数据
{ "ip_records.json": { "result": [ { "_ref": "fixedaddress/blabla", "ipv4addr": "10.10.10.10", "network_view": "Bla" }, { "_ref": "record:host/blabla", "ipv4addrs": [ { "_ref": "record:host_ipv4addr/blabla", "host": "bla.bla.com", "ipv4addr": "10.10.10.10" } ], "name": "bla.bla.com", "view": " " }, { "_ref": "record:a/blabla", "ipv4addr": "10.10.10.10", "name": "bla.bla.com", "view": "bla" } ] } }
已尝试的Ansible任务
我写了三个查询任务,前两个单独执行能得到预期结果,但组合条件查询返回空:
- name: "Search IP Record: Task 2.2: Filter Results." vars: jmesquery: "[] | [?ipv4addr==`{{ infoblox_ip }}`]._ref" set_fact: ip_records_refs: "{{ ip_records.json.result | json_query(jmesquery) }}" - name: "Search IP Record: Task 2.4: Filter Results." vars: jmesquery: "[] | [?_ref.contains(@,`fixedaddress`)]._ref" set_fact: ip_records_refs: "{{ ip_records.json.result | to_json | from_json | json_query(jmesquery) }}" - name: "Search IP Record: Task 2.6: Filter Results." vars: # jmesquery: "[] | ([?ipv4addr==`{{ infoblox_ip }}` && _ref.contains(@,`fixedaddress`)])._ref" jmesquery: "[] | [?ipv4addr==`{{ infoblox_ip }}`].ref | [?_ref.contains(@,`fixedaddress`)]._ref" set_fact: ip_records_refs: "{{ ip_records.json.result | to_json | from_json | json_query(jmesquery) }}"
任务输出结果
TASK [Search IP Record: Task 2.3 Dump variable Content] *********** ok: [localhost] => { "ip_records_refs": [ "fixedaddress/blabla", "record:a/blabla" ] } TASK [Search IP Record: Task 2.5 Dump variable Content] *********** ok: [localhost] => { "ip_records_refs": [ "fixedaddress/blabla" ] } TASK [Search IP Record: Task 2.7 Dump variable Content] *********** ok: [localhost] => { "ip_records_refs": [] }
解决方案
问题出在组合查询的语法错误,修正后的正确写法如下:
正确的Ansible任务
- name: "Search IP Record: Filter fixedaddress records by IP" vars: jmesquery: "[?ipv4addr==`{{ infoblox_ip }}` && contains(_ref, 'fixedaddress')]._ref" set_fact: ip_records_refs: "{{ ip_records.json.result | json_query(jmesquery) }}"
关键修正点
- 字符串包含判断语法错误:原写法
_ref.contains(@,fixedaddress)不符合JMESPath规范,正确写法是contains(_ref, 'fixedaddress'),用于检测_ref字段是否包含指定字符串。 - 组合条件逻辑错误:不需要拆分两次筛选,直接在同一个
[?...]表达式中用&&连接两个条件,同时匹配IP和_ref特征。 - 冗余语法去除:原查询中的
[] |前缀是多余的,直接对result数组进行筛选即可。
预期输出
执行后会得到符合需求的结果:
"ip_records_refs": [ "fixedaddress/blabla" ]
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

