首页 > 解决方案 > Ansible“when 语句不应包含 jinja2 模板”

问题描述

我正在尝试检查某个字符串是否是列表的元素之一。我设法得到了预期的结果,但我找不到一种方法来做到这一点,而不会收到警告说:

[警告]:when 语句不应包含 jinja2 模板分隔符,例如 {{ }} 或 {% %}。

你能帮我理解如何为这个用例做出正确的“何时”声明吗?

这是变量的内容repos

TASK [debug msg={{ repos }}] 
ok: [zimbramta01.essi.lab] => {
"msg": {
    "changed": true,
    "cmd": "yum repolist | cut -f1 -d\" \" | grep -iv 
    \"repolist\\|loaded\\|repo\"",
    "delta": "0:00:10.884070",
    "end": "2018-09-20 08:03:55.210767",
    "failed": false,
    "rc": 0,
    "start": "2018-09-20 08:03:44.326697",
    "stderr": "",
    "stderr_lines": [],
    "stdout": "epel/x86_64\nrhel-7-server-htb-rpms/x86_64\nrhel-7-server- 
     rpms/7Server/x86_64\nzimbra\nzimbra-889-network\nzimbra-889-oss",
    "stdout_lines": [
        "epel/x86_64",
        "rhel-7-server-htb-rpms/x86_64",
        "rhel-7-server-rpms/7Server/x86_64",
        "zimbra",
        "zimbra-889-network",
        "zimbra-889-oss"
    ]
}
}

这就是我的“when”语句的样子(它正在工作,我只是想学习如何正确编写它)。

- name: agrega repositorio epel
  shell: rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
  args:
    warn: False
  when: '"epel/x86_64" not in {{ repos.stdout_lines }}'

我尝试了不同的方法来做到这一点,即使我阅读了 ansible doc、jinja2 doc 和 stackoverflow 中的其他一些帖子,我也无法在没有任何警告的情况下找到正确的方法:/

标签: ansiblejinja2

解决方案


很简单:

when: "'epel/x86_64' not in repos.stdout_lines"

警告表示将whenkey的值作为一个整体作为一个Jinja2表达式处理,即

{% "epel/x86_64" not in {{ repos.stdout_lines }} %}

而且{{ ... }}内部{% ... %}是多余的。


推荐阅读