ansible jinja2 模板中的内联注释

Inline comment in ansible jinja2 template

我的 docker .env 文件是从 jinja2 模板创建的。我正在使用 {# ... #} 作为 comments

它有这个:

FOO={{BAR}}        {# blah blah blah #}
SOMETHING=2

我希望它呈现:

FOO=1
SOMETHING=2

但它实际呈现:

FOO=1    SOMETHING=2

Jinja2 去除块后的尾随换行符,as described in the fine manual

您至少可以通过 3 种方式影响该行为:

  1. 不要使用 end-of-line 注释(因为它们将以 #}\n 结尾,因此 jinja2 会吃掉 \n
  2. 强制 jinja2 块之后的字符为 non-newline 字符(例如 #} \n,尽管这会让 git 和一些编辑发疯,因为它被认为是尾随空格
  3. 如果这发生在 template: 上下文中,您可以关闭 trim_blocks: no;在某些情况下,您也可以通过模板中的 #jinja2:trim_blocks:False header 在模板内部执行此操作,如 template: 文档页面
  4. 所述

2021 年更新(版本 3。0.x)


在标签中使用加号 (+)

正如@mdaniel 所指出的,有几种方法可以调整 Jinja2 的空白行为,但 3.0.x's documentation 中出现了一个新选项,我认为这是解决问题的最简单方法:

... you can manually disable the trim_blocks behavior by putting a plus sign (+) at the end of a block:

<div>
  {% if something +%}
    yay
  {% endif %}
</div>

因此,您的具体问题应该可以通过插入一个加号轻松解决:

FOO={{BAR}}        {# blah blah blah +#}
SOMETHING=2

如果您想删除出现在变量和注释之间的空格,请使用减号显式删除它:

FOO={{BAR}}        {#- blah blah blah +#}
SOMETHING=2

使用trim_blocks参数

由于这个问题标记了 Ansible,我应该指出您还可以通过设置 ansible.builtin.template moduletrim_blocks 参数来修改行为。自 2.4 版以来,这一直是 Ansible 的一部分。默认为 yes,但您可以将其设置为 no 以获得所需的结果。


希望这能帮助发现此问题的其他人寻求类似的解决方案。