何时使用“!=”和 "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
首先,您在此处生成的任务中确实存在两个问题:
- 你想使用模块
file
或模块 stat
但不是两者的奇怪混合
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
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
首先,您在此处生成的任务中确实存在两个问题:
- 你想使用模块
file
或模块stat
但不是两者的奇怪混合 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