Ansible嵌套JMESPath查询中保留null值的实现方法
解决Ansible json_query保留null值的问题
你的问题出在当前的json_query会自动过滤掉data为null的元素,导致输出数组长度和输入不匹配。要保留每个对应位置的null值,需要在查询中对每个元素单独做条件判断,处理data为null的场景。
修改后的查询语句
将原来的_query替换为:
_query: "[].(json.data == null ? null : json.data[*].id) | []"
修改后的完整Playbook
--- - hosts: localhost gather_facts: false vars: response: { "results": [ { "item": "server1", "json": { "data": null, "ok": true }, "status": 200 }, { "item": "server2", "json": { "data": [ { "id": 7, "name": "Production5" } ], "ok": true }, "status": 200 } ] } tasks: - debug: msg: "{{ response.results | community.general.json_query(_query) }}" vars: _query: "[].(json.data == null ? null : json.data[*].id) | []"
执行结果
运行后会得到你需要的输出:
TASK [debug] ********************************************* ok: [localhost] => { "msg": [ null, 7 ] }
逻辑说明
[].(...):遍历response.results中的每一个元素json.data == null ? null : json.data[*].id:对每个元素做三元判断:- 如果
json.data是null,直接返回null - 如果
json.data是数组,提取数组内每个元素的id
- 如果
| []:将嵌套的数组扁平化(比如把[7]转为7),同时保留null值
为什么之前的尝试无效
你之前用的([].json.data || [])[*].id和not_null([].json.data, '[]')是对整个结果数组做统一替换,而非逐个元素处理。这会把第一个元素的null转为空数组,后续[*].id提取不到任何内容,最终被过滤掉,导致输出丢失该位置的元素。
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

