jinja2 何时大括号上的 Ansible 警告

Ansible warning on jinja2 braces on when

我在 vars 中使用此代码

MY_VAR: "{{lookup('env','MY_VAR') | default(true, true)}}"

我正在使用它

- include: task.yml
  when: MY_VAR

这在 Ansible 2.2 中没有任何问题

在 Ansible 2.3 中我收到这样的警告

[WARNING]: when statements should not include jinja2 templating delimiters
 such as {{ }} or {% %}. Found: {{lookup('env','MY_VAR') | default(true,
 true)}}

因此,如果我使用此 MY_VAR: "lookup('env','MY_VAR') | default(true, true)",我的意思是删除 {{ }},那么我不会收到任何警告,但无论我是否将 false 作为 ENV 变量传递,MY_VAR 始终被评估为 true .在我之前给出的代码中工作正常

我该如何解决?

最干净的方法可能是设置一个事实而不是在变量中使用模板(它还会防止查找插件在包含的任务中被多次调用——这不是一个巨大的性能提升,但更干净一些) :

- set_fact:
    MY_VAR: "{{lookup('env','MY_VAR') | default(true, true)}}"

另外请注意,当环境 MY_VARfalse 不同时,它会在所有情况下评估为 true


if I [ ] remove {{ }} then I get no warning but then MY_VAR is always evaluated as true

因为它将被视为一个字符串,并且非空字符串值的计算结果为 true(除了等于 false 的字符串值)。