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
相关产品推荐
相关产品推荐

