Ansible:条件语句不应包含 jinja2 模板分隔符,例如 {{ }} 或 {% %}

Pan*_*nda 3 ansible

有人可以帮助我理解和解决它吗

 - name: Copying file to sever2
    fetch:
      src: /tmp/
      dest: /u0/test/
    when:
      "{{ inventory_hostname == 'testdb' }}"
Run Code Online (Sandbox Code Playgroud)

ses*_*i_c 5

在您的情况下,您应该使用没有 Jinja 分隔符的 when 条件。

例子:

when: inventory_hostname == 'testdb'
Run Code Online (Sandbox Code Playgroud)

详细解释:

当文本和模板的上下文中需要变量插值时,使用 Jinja 模板分隔符。这告诉 Ansible 使用变量的值而不是变量名。

  • 除非另有说明,否则将所有内容视为文本(带分隔符)

例子:

  vars:
    fav_tool: Ansible

  tasks:
  - debug:
      msg: "I like fav_tool"
Run Code Online (Sandbox Code Playgroud)

这将输出:

"msg": "I like fav_tool"
Run Code Online (Sandbox Code Playgroud)

这不是我想要的,我想显示“我喜欢 Ansible”。那么我必须“告诉”ansible 使用fav_tool.

"msg": "I like fav_tool"
Run Code Online (Sandbox Code Playgroud)

同样,我们在模板中使用 Jinja 模板分隔符。我们想要将变量和表达式与文本分开的地方。

示例模板如下:

  - debug:
      msg: "I like {{ fav_tool }}"
Run Code Online (Sandbox Code Playgroud)

... 将产生完全相同的文本而不评估:

if fav_tool == 'Ansible'
I like Ansible
endif
Run Code Online (Sandbox Code Playgroud)

但是,当我们使用 Jinja 分隔符时:

if fav_tool == 'Ansible'
I like Ansible
endif
Run Code Online (Sandbox Code Playgroud)

这将导致:

I like Ansible
Run Code Online (Sandbox Code Playgroud)

当我们使用诸如 之类的条件时when:,我们不需要分隔符,因为条件会自动将变量插入到值中。

  • 除非另有说明,否则将所有内容视为变量和表达式(使用''

例子:

这里的情况颠倒了,任何没有用单引号括起来的东西都会被自动评估。'Ansible'此处仅视为文本(未评估)。

if fav_tool == 'Ansible'
I like Ansible
endif
Run Code Online (Sandbox Code Playgroud)