Ansible任务中如何转义??能否直接嵌入JSON查询?
解决Ansible中json_query里
?字符的YAML语法错误问题 嘿,这个问题我之前也踩过坑!其实根本原因是YAML把?当成了特殊语法字符——在YAML里,?用来定义复杂的映射键,直接写在字符串里会被解析器误判,不是单纯转义?就能搞定的。你之前加反斜杠反而报错,是因为Jinja2模板会先处理那个反斜杠,反而弄巧成拙了。
给你几个靠谱的解决办法,都是不用额外变量的:
方法1:用单引号包裹整个json_query表达式
这是最直接的方案,YAML里单引号包裹的字符串会被当作纯文本,不会解析任何特殊字符。注意json_query里的字符串比较要用反引号(`)来包裹匹配值,避免和外面的单引号冲突:
- name: 获取cluster1对应的端口 debug: msg: "{{ domain | json_query('domain.server[?cluster==`cluster1`].port') }}"
方法2:使用YAML块标量(备选,适合复杂表达式)
如果你的json_query表达式很长,用块标量(|)可以换行写,同样不会触发YAML的特殊语法解析。虽然这里用到了vars,但只是把表达式单独拎出来换行,也算简洁直观:
- name: 获取cluster1对应的端口 debug: msg: "{{ domain | json_query(query) }}" vars: query: | domain.server[?cluster=='cluster1'].port
为什么之前的转义方法没用?
你尝试加\?的时候,Jinja2模板会先处理这个转义字符,把\?解析成?,但YAML在双引号字符串里其实不需要转义?,反而多出来的反斜杠让Jinja2模板解析出错,所以才会报unexpected char '?'的错误。
内容的提问来源于stack exchange,提问作者dranobob
相关产品推荐
相关产品推荐

