我在撰写Jinja2模板时遇到问题(来自Ansible)。
生成的文件是一个JSON文件,我将发送给API(使用Ansible URI模块或使用curl)。模板看起来像这样,基本上可以工作:
{
"description" : "my description",
"pipeline": "{% include 'root/pipeline.j2' %}"
}
问题是root / pipeline.j2的内容非常复杂,包括多行,引号和任何其他使json文件创建无效的东西。我想要做的是通过过滤器解析包含的文件,将其转换为JSON有效字符串;像这样的东西:
{
"description" : "my description",
"pipeline": "{% include 'root/pipeline.j2' | to_json %}"
}
但这不起作用,可能是因为过滤器对文件名起作用,而不是包含的内容。
当我在创建模板时,我看到管道被设置为这样的东西时,有点清晰:
"pipeline": "input {
"input1" {
<snipped>
"
它应该如此出现:
"pipeline": "input {\n \"input1\" {<snipped>"
注意:我只提供前几行,而我正在使用“剪切”字样。我删除了配置的其余部分。
有人能告诉我如何在jinja2模板中使用include,将结果呈现为单行有效的json字符串吗?
提前感谢您的任何帮助。
答案 0 :(得分:0)
我终于找到了解决自己问题的方法。在提供作为API有效负载的JSON的模板中,我现在将一个变量设置为管道模板的内容,这样可以使用to_json轻松过滤它:
{% set pipeline = lookup('template', 'root/pipeline.j2') %}
{
"description" : "my description",
"pipeline": {{ pipeline | to_json }}
}
如果有人能提供更好的答案或解释为什么这不是一个好的答案,我会暂时搁置这个问题的答案。
感谢。