Ansible运行含单引号的JSON输入Playbook报错,如何解析?
解决Ansible Playbook中含单引号JSON的解析问题
方法1:用YAML块标量包裹JSON
YAML的块标量(|或>)能完整保留字符串的原始格式,避开YAML的引号解析逻辑,完美适配带单引号的JSON:
- name: 执行带单引号的JSON查询 debug: msg: "{{ lookup('json_query', query) }}" vars: query: | { "filter": "name == 'John Doe'" }
|会保留所有换行和原始字符,JSON里的单引号不会被YAML当成语法符号处理。
方法2:转义YAML中的单引号
如果偏好行内写法,YAML里用两个连续单引号''表示一个实际的单引号,同时注意转义JSON的双引号(因为外层用双引号包裹字符串):
- name: 转义单引号后执行查询 debug: msg: "{{ lookup('json_query', '{\"filter\": \"name == ''John Doe''\"}') }}"
方法3:将JSON单独存为变量文件
把带单引号的JSON放到独立的变量文件中,避免主Playbook的语法冲突:
比如创建vars/query_vars.yml:
user_filter: | { "filter": "name == 'John Doe'" }
然后在Playbook中引入:
- name: 加载外部变量执行查询 debug: msg: "{{ lookup('json_query', user_filter) }}" vars_files: - vars/query_vars.yml
方法4:用Jinja2 Raw字符串屏蔽解析
用{% raw %}和{% endraw %}包裹JSON,让Ansible不解析里面的特殊字符:
- name: 用Raw字符串处理JSON debug: msg: "{{ lookup('json_query', {% raw %}{\"filter\": \"name == 'John Doe'\"}{% endraw %}) }}"
内容的提问来源于stack exchange,提问作者Deepak
相关产品推荐
相关产品推荐

