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

