Ansible:将嵌套字典中的值添加到其中,然后插入另一个字典中

时间:2020-06-20 04:56:23

标签: python ansible

我正在遍历以下字典,并希望添加嵌套字典的值并将其插入到另一个字典中。

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
        }
    }
}

我正在尝试类似的事情,并且努力设计解决方案。

- 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 }}"

我正在尝试在total_master

中实现的目标
ok: [127.0.0.1] => {
    "msg": {
        "total_cpu": 24,
        "total_used_cpu": 0.71
    }
}

3 个答案:

答案 0 :(得分:2)

这可能是一个选择:

- set_fact:
    result: "{{ result | default({}) | combine({ item: master_nodes | json_query('@.*') | sum(attribute=item)}) }}"
  loop:
    - cpu_total
    - cpu_used

- debug: 
    var: result

给予

ok: [localhost] => 
  result:
    cpu_total: 24
    cpu_used: 0.71

另一种味道

- 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

给予

ok: [localhost] => 
  result:
    total_cpu: 24
    total_cpu_used: 0.71

答案 1 :(得分:0)

嵌套循环应该起作用。

sum1 = 0
sum2 = 0
for val in dict.values():
    for val1 in val.values():
        sum1+=val1['cpu_total']
        sum2+=val1['cpu_used']

result = 
{
    "msg": {
         "total_cpu": sum1,
         "total_used_cpu": sum2 
    }
}   

print(result)

输出:

{'msg': {'total_cpu': 24, 'total_used_cpu': 0.71}}

答案 2 :(得分:0)

感谢您的答复。这就是我的方法。

- name: Total section for master nodes
  set_fact:
    master_cpu: "{{ (master_cpu|float) + (item.value.cpu_total|float)}}"
    master_cpu_used: "{{ (master_cpu_used|float |round(2,'ceil')) + (item.value.cpu_used|float |round(2,'ceil'))}}"
  with_dict: "{{master_nodes}}"