如何在嵌套Jinja2模板中使用Base64过滤器?
Ansible模板嵌套Base64编码问题解决方案
你遇到的问题是Jinja2管道符优先级导致的——直接在{% include %}语句后加| b64encode,会把模板文件名字符串当成编码对象,而非渲染后的模板内容。不用拆分任务的话,有两种直接在模板内解决的方法:
方法1:用表达式形式的include直接过滤
在template-2.yaml.j2里替换成如下写法:
{{ include("template-1.yaml.j2") | b64encode }}
这里include()作为Jinja2表达式函数,会先渲染template-1.yaml.j2得到内容,再将内容传给b64encode过滤器处理,不会再把文件名当作编码目标。
方法2:先存渲染结果到变量再编码
如果需要在模板其他地方复用template-1.yaml.j2的渲染内容,可以先把结果存入变量,再对变量编码:
{% set template1_rendered = include("template-1.yaml.j2") %} {{ template1_rendered | b64encode }}
这种方式更灵活,变量template1_rendered还能在模板其他位置直接使用。
注意:表达式形式的include()需要Jinja2 2.10及以上版本支持,主流Ansible版本对应的Jinja2都满足该要求,若版本过低则需先升级Jinja2。
内容的提问来源于stack exchange,提问作者Guy Steinberger
相关产品推荐
相关产品推荐

