Jinja2模板文件与json安全多行包括

时间:2018-03-27 15:34:02

标签: ansible jinja2

我在撰写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字符串吗?

提前感谢您的任何帮助。

1 个答案:

答案 0 :(得分:0)

我终于找到了解决自己问题的方法。在提供作为API有效负载的JSON的模板中,我现在将一个变量设置为管道模板的内容,这样可以使用to_json轻松过滤它:

{% set pipeline = lookup('template', 'root/pipeline.j2') %}
{
  "description" : "my description",
  "pipeline": {{ pipeline | to_json }}
}

如果有人能提供更好的答案或解释为什么这不是一个好的答案,我会暂时搁置这个问题的答案。

感谢。