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

Ansible中如何在JSON查询里使用item变量并解决返回空数组问题

核心问题原因
  • 不要在已被{{ }}包裹的Jinja2表达式内部再次嵌套{{ }}引用变量:你原代码中在json_query的参数里写{{item}}属于嵌套变量引用,Jinja2会将其识别为字面量而非变量,导致匹配条件永远不成立,返回空数组。
  • 你给出的gpnet是双层嵌套数组结构,直接用with_items遍历会首次循环拿到整个内层数组,无法匹配到字符串类型的Netid值。
修正后的代码
- name: Get the GP id of a Network with VLAN abc
  set_fact:
    # 拆分query字符串拼接item变量,避免嵌套引用和引号转义问题
    gpmgmt: "{{ gplist | json_query('[?Netid == `' + item + '`].{gpid: GP[?gpname == `GP-abc`].gpID}') }}"
  # 用flatten过滤器将双层数组展平,确保循环遍历到单个Netid字符串
  with_items: "{{ gpnet | flatten }}"
  register: gpidmgmt
执行效果说明
  • 当item为L_12345678时,对应条目的GP字段为空,返回空数组属于正常结果。
  • 当item为N_59786432时,会正确返回[{"gpid": ["103"]}]。
可选优化

如果需要直接拿到gpID的字符串值而非嵌套数组,可以调整json_query表达式:

gpmgmt: "{{ gplist | json_query('[?Netid == `' + item + '`].GP[?gpname == `GP-abc`].gpID | [0]') }}"

调整后item为N_59786432时,gpmgmt的值直接为字符串103,无匹配时返回空值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:45:06