在Ansible的Jinja2模板中保留部分表达式时出现错误求助
解决Jinja2模板中部分变量保留原样、部分变量渲染的问题
问题场景
需要在static_traefik.yml.j2模板中写入表达式:
"Host(`{{ .Name }}.access.{{website_tld}}`)"
要求{{ .Name }}保持原样不被Ansible替换,{{website_tld}}在Ansible执行时正常替换,但之前的写法触发了如下错误:
AnsibleError: template error while templating string: unexpected char '\\' at 1016. consulCatalog:\n defaultRule: f\"Host(`{{{{ \\.Name }}}}.access.{{website_tld}}`)\"
正确解决方案
方法1:使用raw块包裹不需要渲染的部分
用{% raw %}和{% endraw %}包裹{{ .Name }},Jinja2会跳过这部分渲染,只处理外部的{{website_tld}}:
consulCatalog: defaultRule: "Host(`{% raw %}{{ .Name }}{% endraw %}.access.{{website_tld}}`)"
方法2:使用字符串转义保留{{和}}
把需要保留的{{写成{{ '{{' }},}}写成{{ '}}' }},实现原样输出{{ .Name }}:
consulCatalog: defaultRule: "Host(`{{ '{{' }} .Name {{ '}}' }}.access.{{website_tld}}`)"
错误原因说明
你之前使用的{{{{ \.Name }}}}写法存在两个问题:
- 多余的反斜杠
\属于无效转义,Jinja2无法识别,触发语法错误 - 重复的
{{和}}不符合Jinja2的转义规则,正确转义需通过raw块或字符串拼接实现
内容的提问来源于stack exchange,提问作者Ciasto piekarz
相关产品推荐
相关产品推荐

