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