List Ansible:如何对列表中的每个复杂参数应用默认值

List Ansible:如何对列表中的每个复杂参数应用默认值,list,dictionary,ansible,yaml,List,Dictionary,Ansible,Yaml,我有以下列表和默认变量: my_list_complex: - key1: val1 key2: val2 key3: val3 keyN: valN - key1: val1 key3: val3 keyN: valN key2: default2 key3: default3 key4: default4 我需要映射我的列表以将所有默认值应用于它。请注意以下事项: 复合体中的键列表是无限的,不可预测的。只有具有默认值且列表元素中不存在的键才应设置为默认值 预期产出为:

我有以下列表和默认变量:

my_list_complex:
- key1: val1
  key2: val2
  key3: val3
  keyN: valN
- key1: val1
  key3: val3
  keyN: valN

key2: default2
key3: default3
key4: default4
我需要映射我的列表以将所有默认值应用于它。请注意以下事项:

复合体中的键列表是无限的,不可预测的。只有具有默认值且列表元素中不存在的键才应设置为默认值 预期产出为:

my_list_complex_default_applied:
- key1: val1
  key2: val2
  key3: val3
  key4: default4
  keyN: valN
- key1: val1
  key2: default2
  key3: val3
  key4: default4
  keyN: valN
我已经研究了combine、map和with_项目,但我没有成功完成任务


对于Ansible任务或角色,我将如何执行此操作?

对于Ansible的最新版本,您可以执行以下操作:

---
- hosts: localhost
  gather_facts: no
  vars:
    my_list_complex:
      - key1: val1
        key2: val2
        key3: val3
        keyN: valN
      - key1: val1
        key3: val3
        keyN: valN
    my_template:
      key2: default2
      key3: default3
      key4: default4

  tasks:
    - set_fact:
        merged_list: "{{ (merged_list | default([])) + [ my_template | combine(item) ] }}"
      with_items: "{{ my_list_complex }}"
    - debug:
        msg: "{{ merged_list }}"

我记不起来了,因为什么版本的Ansible可以增加带有集合事实和项目的列表,但我认为您应该可以使用Ansible 2.1+。

对于Ansible的最新版本,您可以:

---
- hosts: localhost
  gather_facts: no
  vars:
    my_list_complex:
      - key1: val1
        key2: val2
        key3: val3
        keyN: valN
      - key1: val1
        key3: val3
        keyN: valN
    my_template:
      key2: default2
      key3: default3
      key4: default4

  tasks:
    - set_fact:
        merged_list: "{{ (merged_list | default([])) + [ my_template | combine(item) ] }}"
      with_items: "{{ my_list_complex }}"
    - debug:
        msg: "{{ merged_list }}"

我不记得什么版本可以用set\u fact和\u项来增加列表,但我觉得你应该可以使用Ansible 2.1+。

Skilly,所以你可以将复杂项应用到默认键,这是个好主意。这应该是某种标准化的功能:鬼鬼祟祟,所以您可以将复杂项应用于默认键,这是一个好主意。这应该是某种标准化的功能: