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

Ansible使用json_query匹配id_job_template返回空数组问题

问题原因

  • 数据类型不匹配:list_new_job_templates 中存储的 id_job_template 为数字类型,而 specific_node.id 为字符串类型(打印结果带双引号即可证明),JMESPath 的等值判断会严格校验数据类型,类型不一致会直接判定为不相等。
  • 变量作用域不兼容:json_query 执行的 JMESPath 查询默认只会读取当前待解析 JSON 结构内的字段,直接在查询语句中写 specific_node.id 时,程序会尝试从数组的元素中查找 specific_node 字段,不会读取 Ansible 的全局变量,因此无法匹配到对应结果。

解决方法

你可以选择任意一种方式修改查询语句:

方式1:字符串拼接+类型转换(兼容所有Ansible版本)

将 specific_node.id 转换为数字类型后拼接到查询语句中:

- name: Check 4
  debug:
    msg: "{{ list_new_job_templates|json_query('[?id_job_template == `' ~ specific_node.id|int ~ '`]') }}"

如果你需要直接返回匹配的对象而不是仅包含一个元素的数组,可以在过滤器最后增加 | first 提取首个匹配项:

- name: Check 4
  debug:
    msg: "{{ list_new_job_templates|json_query('[?id_job_template == `' ~ specific_node.id|int ~ '`]') | first }}"

方式2:使用vars参数传参(Ansible 2.10及以上版本支持)

通过 json_query 的 vars 参数传入转换好类型的目标值,语法更清晰不易出错:

- name: Check 4
  debug:
    msg: "{{ list_new_job_templates|json_query('[?id_job_template == `target_id`]', vars={'target_id': specific_node.id|int}) }}"

你也可以选择将 id_job_template 转换为字符串和 specific_node.id 匹配,写法如下:

- name: Check 4
  debug:
    msg: "{{ list_new_job_templates|json_query('[?to_string(id_job_template) == `' ~ specific_node.id ~ '`]') }}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:27:02