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

Ansible中解析含转义双引号JSON的注册变量失败问题

问题:Ansible中解析工具输出的JSON字段失败

背景

我有一个证书创建工具,输出的JSON格式如下:

{
    "cert": "abc123......",
    "id": 10,
    "key": "abc123....."
}

实际cert和key的值是base64编码,此细节不影响当前问题。

在Ansible中运行该工具并将输出注册为cert_output变量后,变量内的JSON字符串双引号被转义,结构如下:

{
    "cert_output": {
        "changed": true,
        "delta": "0:00:00.673537",
        "end": "2024-05-14 13:34:45.492559",
        "failed": false,
        "msg": "",
        "rc": 0,
        "start": "2024-05-14 13:34:44.819022",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "{\"id\":233370662,\"cert\":\"abc123...\",\"key\":\"abc123...\"}"
    }
}

尝试的方法及报错

我尝试了两种set_fact写法来提取cert和key字段,但均未成功:

- set_fact:
    cert: "{{ cert_output.stdout|from_json|json_query('.cert') }}"
    key: "{{ cert_output.stdout|from_json|json_query('.key') }}"

- set_fact:
    cert: "{{ cert_output.stdout|json_query('.cert') }}"
    key: "{{ cert_output.stdout|json_query('.key') }}"

得到的报错信息如下:

FAILED! => {"msg": "JMESPathError in json_query filter plugin:\ninvalid token: Parse error at column 0, token "." (DOT), for expression:\n".cert"\n ^"}

解决方案

问题出在两个点:

  1. 未先将转义的JSON字符串转为结构化字典就直接用json_query;
  2. 使用json_query时表达式格式错误,JMESPath语法中直接写字段名即可,不需要以.开头。

以下是两种正确的写法:

写法一:直接使用字典索引(推荐)

- set_fact:
    cert: "{{ (cert_output.stdout | from_json).cert }}"
    key: "{{ (cert_output.stdout | from_json).key }}"

写法二:修正json_query的表达式

- set_fact:
    cert: "{{ cert_output.stdout | from_json | json_query('cert') }}"
    key: "{{ cert_output.stdout | from_json | json_query('key') }}"

解释:

  • from_json过滤器会将转义的JSON字符串转换为Ansible可识别的字典结构;
  • 转换后,要么直接通过.索引字段,要么用json_query时传入正确的字段名表达式(不需要前缀.)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 22:25:12