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 ^"}
解决方案
问题出在两个点:
- 未先将转义的JSON字符串转为结构化字典就直接用
json_query; - 使用
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
相关产品推荐
相关产品推荐

