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中需要用反引号包裹。
第二种写法的错误
- Ansible中访问数字开头的字典键时,不能用
.语法(test.network_data.0),因为数字不符合变量命名规则,会解析失败,必须改用方括号语法test.network_data['0']。 - 已经定位到"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
相关产品推荐
相关产品推荐

