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

Ansible 2.9中用json_query提取mac_addr值失败的问题求助

问题:Ansible 2.9提取JSON字段失败排查

我是Ansible和JSON初学者,使用Ansible 2.9版本,需要从名为test的变量中提取network_data下"0"节点内的mac_addr值(示例值为00:50:56:a2:57:c9)并完成注册,但尝试了两种json_query写法均无法成功,请求指出错误所在。

相关变量数据

"msg": [
    {
        "changed": false,
        "failed": false,
        "network_data": {
            "0": {
                "allow_guest_ctl": true,
                "connected": true,
                "device_type": "test0",
                "label": "test1",
                "mac_addr": "00:50:56:a2:57:c9",
                "name": "DVSwitch: ",
                "start_connected": true,
                "unit_number": 7,
                "wake_onlan": true
            }
        }
    }
]

(注:原数据存在截断,已补全必要结构)

尝试过的命令

第一种写法:

- name: show test result
  debug:
    msg:
     - "{{ test.network_data | json_query('0[*].mac_addr') }}"
  register: mac

第二种写法:

- name: show test result
  debug:
    msg:
     - "{{ test.network_data.0 | json_query('mac_addr') }}"
  register: mac

错误分析与正确写法

第一种写法的错误

0[*].mac_addr的json_query语法有误:

  • "0"对应的是一个字典对象,不是数组,[*]是数组遍历语法,不能用于字典。针对字典键的正确写法是直接用0.mac_addr,同时注意数字键在json_query中需要用反引号包裹。

第二种写法的错误

  1. Ansible中访问数字开头的字典键时,不能用.语法(test.network_data.0),因为数字不符合变量命名规则,会解析失败,必须改用方括号语法test.network_data['0']。
  2. 已经定位到"0"节点的字典后,直接访问mac_addr即可,不需要额外使用json_query('mac_addr'),属于冗余操作。

正确写法示例

写法1:直接变量访问(无需json_query)

- name: extract mac address
  debug:
    msg: "{{ test.network_data['0'].mac_addr }}"
  register: mac

写法2:正确使用json_query

- name: extract mac address with json_query
  debug:
    msg: "{{ test.network_data | json_query('`0`.mac_addr') }}"
  register: mac

(注:json_query中用反引号`包裹数字键0,避免被解析为数组索引)


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:50:53