I am iterating over the following dictionary of dictionaries and want to add the values of nested dictionary and insert them into another dictionary.
master_nodes
ok: [127.0.0.1] => { "msg": { "master01.example.com": { "cpu_total": 8, "cpu_used": 0.22 }, "master02.example.com": { "cpu_total": 8, "cpu_used": 0.27 }, "master03.example.com": { "cpu_total": 8, "cpu_used": 0.22 } } }
I am trying something like this and struggling to devise a solution.
- name: Total section for master nodes set_fact: total_master: "{{ (total_master | default({}))| combine({ 'total_cpu' : total_cpu+(item.value.cpu_total|int) }) }} " with_dict: "{{ master_nodes }}"
What I am trying achieve in total_master
ok: [127.0.0.1] => { "msg": { "total_cpu": 24, "total_used_cpu": 0.71 } }
Advertisement
Answer
This could be one option:
- set_fact: result: "{{ result | default({}) | combine({ item: master_nodes | json_query('@.*') | sum(attribute=item)}) }}" loop: - cpu_total - cpu_used - debug: var: result
gives
ok: [localhost] => result: cpu_total: 24 cpu_used: 0.71
Another flavour,
- set_fact: result: "{{ { 'total_cpu': master_nodes | json_query('@.*.cpu_total') | sum(), 'total_cpu_used': master_nodes | json_query('@.*.cpu_used') | sum() } }}" - debug: var: result
gives
ok: [localhost] => result: total_cpu: 24 total_cpu_used: 0.71