Ansible YAML 追加到键下的列表(?)

Ansible YAML append to list under a key (?)

我有以下名为 groceries 的角色变量:

groceries:
  fruits:
    - name: 'Apples'
      cost: 100
    - name: 'Grapes'
      cost: 200
  vegetables:
    - name: 'Potatoes'
      cost: 120
  toiletries:
    - name: 'Toothpaste'
      cost: 20

这些在模板中使用。

根据主机 and/or 组,我想追加额外的 vegetables:

groceries_additional:
  vegetables:
    - brand: 'Aubergine'
      cost: 100

或追加fruits:

groceries_additional:
  fruits:
    - name: 'Blackberries'
      cost: 1000

我不想更新模板。有什么方法可以将 groceries_additional 附加到 groceries 中吗?这是我的目标结果:

groceries:
  fruits:
    - name: 'Apples'
      cost: 100
    - name: 'Grapes'
      cost: 200
    - name: 'Blackberries'
      cost: 1000
  vegetables:
    - name: 'Potatoes'
      cost: 120
    - brand: 'Aubergine'
      cost: 100
  toiletries:
    - name: 'Toothpaste'
      cost: 20

我试图通过以下方式“合并”到 groceries,但没有成功(groceries 根本没有改变)。

- name: Merge
  set_fact:
    groceries: '{{ groceries_additional | combine(base_groceries, recursive=True) }}'
  vars:
    base_groceries: '{{ groceries | default({}) }}'
  when: groceries_additional is defined

使用选项 list_merge,例如

    - set_fact:
        groceries: "{{ groceries|combine(groceries_additional,
                                         recursive=True,
                                         list_merge='append') }}"
      vars:
        groceries_additional:
          vegetables:
            - brand: 'Aubergine'
              cost: 100

给予

  groceries:
    fruits:
    - cost: 100
      name: Apples
    - cost: 200
      name: Grapes
    toiletries:
    - cost: 20
      name: Toothpaste
    vegetables:
    - cost: 120
      name: Potatoes
    - brand: Aubergine
      cost: 100

以及随之而来的

    - set_fact:
        groceries: "{{ groceries|combine(groceries_additional,
                                         recursive=True,
                                         list_merge='append') }}"
      vars:
        groceries_additional:
          fruits:
            - name: 'Blackberries'
              cost: 1000

给出了预期的结果

  groceries:
    fruits:
    - cost: 100
      name: Apples
    - cost: 200
      name: Grapes
    - cost: 1000
      name: Blackberries
    toiletries:
    - cost: 20
      name: Toothpaste
    vegetables:
    - cost: 120
      name: Potatoes
    - brand: Aubergine
      cost: 100