未定义与 Ansible 中的未定义

问题描述 投票:0回答:1

在 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 jinja2 ansible-2.x
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.