0

I'm trying to loop through a list and append the result to my existing dictionary, but I can't figure out a way to call the 'item' variable inside my set fact.

Although I understand I can't stack moustaches, this is an example of what I'm trying to achieve:

- name: Init list
  set_fact:
    param_list: "{{ param_list | default({ 'full_page_writes': 'off', 'autovacuum': 'off', 'wal_buffers': -1 }) }}"

- name: Append
  set_fact:
# config is a json variable from a previous step
    param_list: "{{ param_list | combine ({ {{ item }} : config.settings.{{ item }}.setting })) }}"
  with_items:
    - work_mem
    - shared_buffers
    - maintenance_work_mem
    - wal_buffers

I tried with lookup, but couldn't find how to use it in this example

1 Answers1

1

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

  1. 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
  1. 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
Vladimir Botka
  • 58,131
  • 4
  • 32
  • 63