何时使用“!=”和 "is not"

When to use "!=" and "is not"

Ansible:2.9

什么时候应该在 Ansible 中的 include: create_dir.yml 之前在 when 中使用 !=is not

示例代码:

- name: "Get stat"  
   stat:
     path: "/tmp"
   register: stat_result

- include: create_dir.yml
  when: stat_result.exists is not True

首先,您在此处生成的任务中确实存在两个问题:

  1. 你想使用模块 file 或模块 stat 但不是两者的奇怪混合
  2. stat 模块会给你一个包含键 exists 的复杂类型 stat,所以你真的应该测试 stat_result.stat.exists

所以,下面的解释是基于任务:

- stat:
    path: "/tmp"
  register: stat_result

- include: create_dir.yml
  when: stat_result.stat.exists is not true

其中两个工作任务。


正如 Jinja 文档中指出的:

is: Performs a test.

来源https://jinja.palletsprojects.com/en/2.11.x/templates/#other-operators

!=: Compares two objects for inequality.

来源https://jinja.palletsprojects.com/en/2.11.x/templates/#comparisons

但是因为在 Jinja 中定义了 true() and false() 测试,你确实可以这样写:

when: stat_result.stat.exists is not true()

所以更短的版本是

when: stat_result.stat.exists is not true 
# because the test function receives no parameters

现在这个测试确实类似于

when: stat_result.stat.exists != True

例外的是 is not true 测试比 != True

更健壮并且可以更好地处理未定义的变量

例如,如果您评论您的 stat 任务,测试

when: stat_result.stat.exists is not true

会成功,而

when: stat_result.stat.exists != True

会引发致命错误:

The conditional check 'stat_result.stat.exists != True' failed. The error was: error while evaluating conditional (stat_result.stat.exists != True): 'stat_result' is undefined


现在这个测试真的不是最优的,因为你不应该做像 when: bool_var is not true 这样的事情,你应该做 when: not bool_var,所以:

when: not stat_result.stat.exists