这个 jinja2 过滤器在 Ansible 中起什么作用?d({})

这个 jinja2 过滤器在 Ansible 中起什么作用?d({})

我尝试理解以下代码块在 Ansible-Playbook 中的作用

environment: '{{ inventory__environment | d({})
                   | combine(inventory__group_environment | d({}))
                   | combine(inventory__host_environment  | d({})) }}'

据我所知,environment:关键字在目标主机上设置环境变量。双胡须{{ xxx }}标记了一个 jinja2 表达式 - 如果我错了请纠正我。因此,会对括号内的内容进行某种评估。以下格式的表达式{{ x | y }}在 Ansible 中称为“过滤器”。它就像 Bash 中的管道一样工作。

那么这个特殊的函数是起什么作用d()的呢?

答案1

问:“这个名为 d() 的特殊函数有什么作用?”

A:d()是快捷方式default().例如下面的任务

    - set_fact:
        dictX: '{{ dict1 | d({}) |
                   combine(dict2 | d({})) |
                   combine(dict3 | d({})) }}'
    - debug:
        var: dictX

其中dict1dict2dict3未定义,则

    "dictX": {}


过滤器combine结合了词典。让我们测试一下。例如

  vars:

    dict1:
      key1: 'value1'
#   dict2:
#     key2: 'value2'
    dict3:
      key3: 'value3'

  tasks:

    - set_fact:
        dictX: '{{ dict1 | d({}) |
                   combine(dict2 | d({})) |
                   combine(dict3 | d({})) }}'
    - debug:
        var: dictX

    "dictX": {
        "key1": "value1", 
        "key3": "value3"
    }

相关内容