1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2026-03-22 05:09:12 +00:00

merge_variables: extended merge capabilities added (#11536)

* merge_variables: extended merge capabilities added

This extension gives you more control over the variable merging process of the lookup plugin `merge_variables`. It closes the gap between Puppet's Hiera merging capabilities and the limitations of Ansible's default variable plugin `host_group_vars` regarding fragment-based value definition. You can now decide which merge strategy should be applied to dicts, lists, and other types. Furthermore, you can specify a merge strategy that should be applied in case of type conflicts.

The default behavior of the plugin has been preserved so that it is fully backward-compatible with the already implemented state.

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* Update changelogs/fragments/11536-merge-variables-extended-merging-capabilities.yml

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update plugins/lookup/merge_variables.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* Periods added at the end of each choice description

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* Update plugins/lookup/merge_variables.py

Co-authored-by: Mark <40321020+m-a-r-k-e@users.noreply.github.com>

* ref: follow project standard for choice descriptions

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* ref: more examples added and refactoring

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* Update plugins/lookup/merge_variables.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* ref: some more comments to examples added

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* fix: unused import removed

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* ref: re-add "merge" to strategy map

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* Update comments

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* Specification of transformations solely as string

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* Comments updated

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* ref: `append_rp` and `prepend_rp` removed
feat: options dict for list transformations re-added
feat: allow setting `keep` for dedup transformation with possible values: `first` (default) and `last`

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* ref: improve options documentation

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* ref: documentation improved, avoiding words like newer or older in merge description

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* Update plugins/lookup/merge_variables.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* ref: "prio" replaced by "dict"

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* feat: two integration tests added

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

---------

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>
Co-authored-by: Fiehe Christoph <c.fiehe@eurodata.de>
Co-authored-by: Felix Fontein <felix@fontein.de>
Co-authored-by: Mark <40321020+m-a-r-k-e@users.noreply.github.com>
This commit is contained in:
Christoph Fiehe 2026-03-19 22:45:44 +01:00 committed by GitHub
parent 25b5655be7
commit dae2157bb7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 989 additions and 42 deletions

View file

@ -44,6 +44,62 @@
vars:
merged_dict: "{{ lookup('community.general.merge_variables', '^.+__merge_dict$') }}"
- name: Test shallow dict merge with 'list_merge=append' and 'dedup'
block:
- name: Print the merged dict
ansible.builtin.debug:
msg: "{{ merged_dict }}"
- name: Validate the merged dict
ansible.builtin.assert:
that: "merged_dict == expected_dict"
vars:
expected_dict:
a: "{{ testdict4__test['a'] }}"
b:
- 3
- 4
- "5": value
- 1
- 2
vars:
merged_dict: "{{
lookup(
'community.general.merge_variables', '__test', pattern_type='suffix', override='ignore',
dict_merge='shallow', list_merge='prepend', list_transformations=['dedup']) }}"
- name: Test deep dict merge with 'list_merge=prepend' and 'dedup' with 'keep=last'
block:
- name: Print the merged dict
ansible.builtin.debug:
msg: "{{ merged_dict }}"
- name: Validate the merged dict
ansible.builtin.assert:
that: "merged_dict == expected_dict"
vars:
expected_dict:
a:
a:
x: low_value
y: high_value
list:
- high_value
- low_value
z: high_value
b:
- 4
- "5": value
- 1
- 2
- 3
vars:
merged_dict: "{{
lookup(
'community.general.merge_variables', '__test', pattern_type='suffix', override='ignore',
dict_merge='deep', list_merge='prepend',
list_transformations=[{'name': 'dedup', 'options': {'keep': 'last'}}]) }}"
# Test the behavior when no results are found
- name: Test merge without results
block: