在 Ansible 中,'undefined' 和 'not defined' 之间有区别吗?
我看到这两个术语可以互换使用,但我想确保没有遗漏任何细微差别。据我了解,这两个术语都指的是尚未定义或未分配任何值的变量。
这是正确的,还是在某些情况下应该以不同的方式使用它们?有人可以提供明确的解释或指向相关文档吗?
我尝试运行以下剧本,因为我认为不同之处在于变量的声明,但它没有按预期工作。
---
- name: Example play-book
hosts: localhost
gather_facts: no
vars:
# This variable is defined with a value assigned to it
defined_var: "Hello, world!"
# This variable is defined but has no value assigned to it
undefined_var:
# This variable is not defined at all
# not_defined_var:
tasks:
- name: Task 1
debug:
var: defined_var
- name: Task 2
debug:
msg: "VARIABLE IS UNDEFINED"
when: undefined_var is undefined
- name: Task 3
debug:
var: not_defined_var
when: not_defined_var is undefined
输出:
PLAY [Example playbook] *******************************************
TASK [Task 1] *****************************************************
ok: [localhost] => {
"defined_var": "Hello, world!"
}
TASK [Task 2] *****************************************************
skipping: [localhost]
TASK [Task 3] *****************************************************
ok: [localhost] => {
"not_defined_var": "VARIABLE IS NOT DEFINED!"
}
Ansible 模板系统是 Jinja,在 Jinja 文档中我们可以看到:
jinja-tests.undefined(value: Any) → bool
像但反过来。defined()
来源:https://jinja.palletsprojects.com/en/3.1.x/templates/#jinja-tests.undefined
所以,是的,一个很简单,是另一个的
not
变体。
{{ var is not defined == var is undefined }} {# => will always be true #}
{{ var is not undefined == var is defined }} {# => will always be true #}
default()
时可以做到不同,这是 defined()
测试文档中引用的处理未定义变量的方法:
{{ '' | default('this is a placeholder') }}
将呈现一个空白字符串,而
{{ '' | default('this is a placeholder', true) }}
将呈现占位符,
this is a placeholder
,因为第二个参数将帮助您控制评估为 false 的变量(空值 - ''
字符串,()
元组,{}
字典,[]
列表 -,布尔值 false
, None
, 0
).
如果你想更进一步并在 Jinja 的代码中达到顶峰,你可以看到
defined
测试是这样定义的:
def test_defined(value: t.Any) -> bool:
return not isinstance(value, Undefined)
来源:https://github.com/pallets/jinja/blob/main/src/jinja2/tests.py
和
undefined
这样的:
def test_undefined(value: t.Any) -> bool:
return isinstance(value, Undefined)
来源:https://github.com/pallets/jinja/blob/main/src/jinja2/tests.py