如何在 jinja2 中转义双花括号?

gr0*_*gu3 13 jinja2 ansible

我需要在我正在使用 Ansible 处理的代码中转义双花括号。问题是我拥有所有需要在变量中转换的参数。基本上我正在研究模板创建者。

我试过使用 {% raw %}{{ name-of-variable }}{% endraw %} 但它没有用。当我尝试 /{/{ name-of-variable }} 我几乎明白了,但我也试图摆脱反斜杠。

下面是一些代码:

local_action:
    module: replace
    path: "/tmp/{{ ambiance }}/{{ seed }}DEFAULT.j2"
    regexp: "{{ item.regexp1 }}"
    replace: "{{ item.replace }}"
  with_items: 
    - { regexp1: '^DBHOST.*$', replace: 'DBHOST = {% raw %}{{ databasehost }}{% endraw %}' }
    - { regexp1: '^GLOBALHOST.*$', replace: 'GLOBALHOST = {% raw %}{{ global_hostname }}{% endraw %}' }
Run Code Online (Sandbox Code Playgroud)

我期望结果如下:

DBHOST = {{ satabasehost }}
GLOBALHOST = {{ global_hostname }}
Run Code Online (Sandbox Code Playgroud)

任何建议/想法?

blh*_*ing 32

{% raw %}{{ databasehost }}{% endraw %} 应该管用。

您也可以将其{{ '{{ databasehost }}' }}用作替代品。

  • OP 明确指出这对他们不起作用。 (4认同)

joj*_*ojo 7

只是为了避免混淆:

  • ansible [core 2.14.0]
  • jinja version = 3.1.2

所有选项均来自@blhsing 建议的答案以及@DustWolf 的答案

这是一个玩具示例,演示了官方jinja 文档中推荐的方法的使用以及 ansible 数据类型的使用!unsafe

考虑该文件test.j2

DBHOST blabla
GLOBALHOST blablu
OTHERHOST blabli
Run Code Online (Sandbox Code Playgroud)

play.yml

DBHOST blabla
GLOBALHOST blablu
OTHERHOST blabli
Run Code Online (Sandbox Code Playgroud)

我们最终得到修改后的test.j2

DBHOST = {{ databasehost }}
GLOBALHOST = {{ global_hostname }}
OTHERHOST = {{ other_hostname }}
Run Code Online (Sandbox Code Playgroud)

{% raw %}...{% endraw %}因此,该块对 OP 不起作用的事实并不是因为这不是一个有效的方法!这可能是由于完成替换的文件内容的某些特殊性,但这只是猜测。

  • 值得一提的是,当 jinja2 语法无效时,`{% raw %}...{% endraw %}` 不起作用,例如当您尝试输出包含 `{%` 但实际上不是的 RADIUS 配置时jinja2 语法。在这种情况下,只有 `!unsafe` 选项有效。 (2认同)