Ansible json_query查询ESET Agent版本无返回值问题求助
问题原因
该问题90%以上是JMESPath查询的字段类型不匹配导致的,核心原因如下:
- Ansible的
json_query依赖JMESPath库,做条件过滤时会同时校验值的类型和内容:你当前查询语句里os_group == "192"是把os_group当做字符串匹配,但ESET接口返回的os_group字段实际是整数类型,类型不一致会直接过滤掉所有符合条件的条目。 - 部分场景下Ansible解析接口返回的JSON时会生成特殊Python对象,不是纯字典结构,也会导致
json_query的条件识别失败。 - 引号冲突:你当前用单引号包裹查询语句,内部字符串用双引号,部分低版本JMESPath/Ansible会出现引号解析异常,导致过滤条件失效。
解决方法
按顺序尝试以下方案即可:
方案1:修正查询语句的类型与引号写法
将查询语句里的字符串常量用反引号包裹,同时去掉192的引号(匹配整数类型):
vars: jsonq: 'files.installer[?(@.component == `Agent` && @.os_group == `192`)].full_version'
如果确认os_group是字符串类型,就保持192的引号,只把Agent的引号换成反引号即可。
方案2:增加JSON类型强制转换
如果方案1无效,在执行json_query前先做一次JSON序列化反序列化,强制转换为纯字典结构:
set_fact: latest_era_version: "{{ (latest_era_version_raw.json | to_json | from_json | json_query(jsonq)) }}"
方案3:前置调试确认字段属性
如果还是返回空,先加调试任务确认字段的实际值和类型,排除字段拼写、大小写、前后空格问题:
- name: 校验installer字段属性 debug: msg: "component值:{{ item.component }}, os_group值:{{ item.os_group }}, os_group类型:{{ item.os_group | type_debug }}" loop: "{{ latest_era_version_raw.json.files.installer }}"
内容的提问来源于stack exchange,提问作者Benjamin D
相关产品推荐
相关产品推荐

