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

Ansible set_fact中json_query返回空字符串的原因及解决方法

问题根因

json_query 底层基于JMESPath语法做查询,你写的查询路径[][].[metrics2, metrics3]和param变量的实际嵌套层级不匹配:
你的param是三层嵌套结构:最外层是包含2个元素的列表,每个元素本身又是包含3个字典的子列表,字典内存储metrics1/metrics2/metrics3字段。原查询仅穿透了一层列表,无法定位到最内层的字典,因此返回空值。

修正方法

根据你需要的返回结构,选择对应的查询语句即可:

1. 保留原有列表分组结构

如果需要和原param的两层分组结构保持一致,将查询路径改为[*][*].[metrics2, metrics3],完整配置如下:

- hosts: localhost

  tasks:
    - set_fact:
       param:
        - - {metrics1: A, metrics2: B, metrics3: C}
          - {metrics1: D, metrics2: E, metrics3: F}
          - {metrics1: G, metrics2: H, metrics3: I}
        - - {metrics1: J, metrics2: K, metrics3: L}
          - {metrics1: M, metrics2: N, metrics3: O}
          - {metrics1: P, metrics2: Q, metrics3: R}
      parseParam: "{{ param | json_query('[*][*].[metrics2, metrics3]') }}"

    - debug:
        var: parseParam

执行返回结果:

"parseParam": [
    [["B", "C"], ["E", "F"], ["H", "I"]],
    [["K", "L"], ["N", "O"], ["Q", "R"]]
]

2. 打平为一维列表

如果不需要保留原有分组,要直接拿到所有metrics2和metrics3的键值对,将查询路径改为[][][] | [].[metrics2, metrics3]即可,对应配置片段:

parseParam: "{{ param | json_query('[][][] | [].[metrics2, metrics3]') }}"

执行返回结果:

"parseParam": [
    ["B", "C"],
    ["E", "F"],
    ["H", "I"],
    ["K", "L"],
    ["N", "O"],
    ["Q", "R"]
]

前置依赖说明

如果运行时抛出json_query相关报错,先在Ansible控制节点执行pip install jmespath安装所需依赖即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:09:59