【问题标题】:Jinja2 templated file with json safe multiline include带有 json 安全多行的 Jinja2 模板文件包含
【发布时间】:2018-03-27 15:34:01
【问题描述】:

我正在编写的 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>"

注意:我只给出了前几行,并且我在删除其余配置的地方使用了“snipped”。

谁能告诉我如何在 jinja2 模板中使用包含将结果呈现为单行有效 json 字符串的方法?

提前感谢您的帮助。

【问题讨论】:

    标签: ansible jinja2


    【解决方案1】:

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

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

    我会将这个问题的答案保留一段时间,以防有人能提供更好的答案或解释为什么这不是一个好的答案。

    谢谢。

    【讨论】:

      猜你喜欢
      • 2023-01-21
      • 2014-05-16
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多