Put the default dictionary into a variable
params_default_dict:
full_page_writes: 'off'
autovacuum: 'off'
wal_buffers: -1
Then, if the variable param_dict is not defined the task below
- set_fact:
param_dict: "{{ param_dict|default(params_default_dict) }}"
creates the dictionary
param_dict:
autovacuum: 'off'
full_page_writes: 'off'
wal_buffers: -1
Let's put the list of the parameters into a variable as well
params_add:
- work_mem
- shared_buffers
- maintenance_work_mem
- wal_buffers
Create a configuration for testing
config:
settings:
work_mem: v1
shared_buffers: v2
maintenance_work_mem: v3
wal_buffers: v4
Declare the dictionary of additional parameters
params_add_dict: "{{ dict(params_add|
zip(params_add|
map('extract', config.settings))) }}"
gives
params_add_dict:
maintenance_work_mem: v3
shared_buffers: v2
wal_buffers: v4
work_mem: v1
Combine the dictionaries
- set_fact:
param_dict: "{{ param_dict|combine(params_add_dict) }}"
gives
param_dict:
autovacuum: 'off'
full_page_writes: 'off'
maintenance_work_mem: v3
shared_buffers: v2
wal_buffers: v4
work_mem: v1
Notes
- Example of a complete playbook for testing
- hosts: localhost
vars:
params_default_dict:
full_page_writes: 'off'
autovacuum: 'off'
wal_buffers: -1
params_add:
- work_mem
- shared_buffers
- maintenance_work_mem
- wal_buffers
config:
settings:
work_mem: v1
shared_buffers: v2
maintenance_work_mem: v3
wal_buffers: v4
params_add_dict: "{{ dict(params_add|
zip(params_add|
map('extract', config.settings))) }}"
tasks:
- set_fact:
param_dict: "{{ param_dict|default(params_default_dict) }}"
- debug:
var: param_dict
- debug:
var: params_add_dict
- set_fact:
param_dict: "{{ param_dict|combine(params_add_dict) }}"
- debug:
var: param_dict
- Test the configuration dictionary with added attribute settings
config:
settings:
work_mem:
settings: v1
shared_buffers:
settings: v2
maintenance_work_mem:
settings: v3
wal_buffers:
settings: v4
The iteration gives the same result
- name: Append
set_fact:
param_dict: "{{ param_dict|
combine({item: config.settings[item].settings}) }}"
loop: "{{ params_add }}"
Change the declaration below to get the result without iteration
params_add_dict: "{{ dict(params_add|
zip(params_add|
map('extract', config.settings, ['settings']))) }}"
Example of a complete playbook for testing
- hosts: localhost
vars:
params_default_dict:
full_page_writes: 'off'
autovacuum: 'off'
wal_buffers: -1
params_add:
- work_mem
- shared_buffers
- maintenance_work_mem
- wal_buffers
config:
settings:
work_mem:
settings: v1
shared_buffers:
settings: v2
maintenance_work_mem:
settings: v3
wal_buffers:
settings: v4
params_add_dict: "{{ dict(params_add|
zip(params_add|
map('extract', config.settings, ['settings']))) }}"
tasks:
- set_fact:
param_dict: "{{ param_dict|default(params_default_dict) }}"
- debug:
var: param_dict
- debug:
var: params_add_dict
- name: Append
set_fact:
param_dict: "{{ param_dict|
combine({item: config.settings[item].settings}) }}"
loop: "{{ params_add }}"
when: iterate|d(false)|bool
- set_fact:
param_dict: "{{ param_dict|combine(params_add_dict) }}"
when: not iterate|d(false)|bool
- debug:
var: param_dict