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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:25:29