逃避Ansible中的双花括号

Dav*_*rri 55 jinja2 ansible docker

如何逃避Ansible 1.9.2中的双花括号?

例如,如何在以下shell命令中转义双花括号?

- name: Test 
  shell: "docker inspect --format '{{ .NetworkSettings.IPAddress }}' instance1"
Run Code Online (Sandbox Code Playgroud)

udo*_*dan 91

每当你在Ansible中遇到冲突字符的问题时,经验法则是将它们作为Jinja表达式中的字符串输出.

所以{{你不会使用{{ '{{' }}:

- debug: msg="docker inspect --format '{{ '{{' }} .NetworkSettings.IPAddress {{ '}}' }}' instance1"
Run Code Online (Sandbox Code Playgroud)

Jinja2文档中的主题"逃脱".

  • `raw_var: "{{ '{{' }}某事{{ '}}' }}"`? (2认同)

Fil*_*ipe 39

这个:

- name: Test 
  shell: "docker inspect --format {% raw %}'{{ .NetworkSettings.IPAddress }}' {% endraw %} instance1"
Run Code Online (Sandbox Code Playgroud)

应该管用

另一种方法是使用反斜杠 \{\{ .NetworkSettings.IPAddress \}\}

希望能帮助到你

  • 我刚刚在1.9.2中对此进行了测试,而`{raw} ... {%endraw%}`对我有用.逃避虽然确实不起作用.它将导致`\\ {\\ {.NetworkSettings.IPAddress \\} \\}` (3认同)
  • 谢谢 Filippe,但我已经尝试过两者,但它们不起作用:( (2认同)

Tig*_*eng 21

试用了ansible 2.1.1.0

{%raw%} ... {%endraw%}块似乎是明确的方式

- name: list container images and name date on the server
  shell: docker ps --format {%raw%}"{{.Image}} {{.Names}}"{%endraw%}
Run Code Online (Sandbox Code Playgroud)

只需要逃避领先'{{'

tasks:
- name: list container images and names
  shell: docker ps --format "{{'{{'}}.Image}} {{'{{'}}.Names}}"
Run Code Online (Sandbox Code Playgroud)

除了更难以阅读之外,没有损害尾随'}}'.

tasks:
- name: list container images and names
  shell: docker ps --format "{{'{{'}}.Image{{'}}'}} {{'{{'}}.Names{{'}}'}}"
Run Code Online (Sandbox Code Playgroud)

反斜杠'\'似乎不起作用


Ben*_*Ben 5

Ansible 2.0中的新功能是可以将值指定为不安全类型。

在您的示例中,您可以执行以下操作:

- name: Test 
  shell: !unsafe "docker inspect --format '{{ .NetworkSettings.IPAddress }}' instance1"
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅文档

  • 嘘,我说2.0 (2认同)

小智 5

我有一个类似的问题:我需要发布一个由 jinja2 模板制作的 JSON 文档,其中包含一些 go 模板变量(是的,我知道 :-P),例如

"NAME_TEMPLATE": %{{service_name}}.%{{stack_name}}.%{{environment_name}}

试图将模板的这部分隔离在

{% raw %} ... {% endraw %}

没有用,因为 ansible 有某种魔法可以运行模板和变量替换两次(我不确定,但它确实看起来像这样)

service_name尝试使用模板时,您最终会得到“未定义的变量”...

所以我最终使用了!unsafe和的组合{% raw %} ... {% endraw %}来定义后来在模板中使用的事实。

- set_fact:
   __rancher_init_root_domain: "{{ rancher_root_domain }}"
   #!unsafe: try to trick ansible into not doing substitutions in that string, then use %raw% so the value won't substituted another time
   __rancher_init_name_template: !unsafe "{%raw%}%{{service_name}}.%{{stack_name}}.%{{environment_name}}{%endraw%}"

- name: build a template for a project
  set_fact:
    __rancher_init_template_doc: "{{ lookup('template', 'templates/project_template.json.j2') }}"
Run Code Online (Sandbox Code Playgroud)

该模板包含以下内容:

    "ROOT_DOMAIN":"{{__rancher_init_root_domain}}",
    "ROUTE53_ZONE_ID":"",
    "NAME_TEMPLATE":"{{__rancher_init_name_template }}",
    "HEALTH_CHECK":"10000",
Run Code Online (Sandbox Code Playgroud)

输出正常:

"NAME_TEMPLATE": "%{{service_name}}.%{{stack_name}}.%{{environment_name}}",
Run Code Online (Sandbox Code Playgroud)


bma*_*pin 5

这是udondan 答案的简短替代方案;用双括号将整个字符串括起来:

shell: "docker inspect --format {{ '{{ .NetworkSettings.IPAddress }}' }} instance1"
Run Code Online (Sandbox Code Playgroud)