Ansible: Добавить значения во вложенном словаре между собой и вставить в другой словарь - PullRequest
0 голосов
/ 20 июня 2020

Я перебираю следующий словарь словарей и хочу добавить значения вложенного словаря и вставить их в другой словарь.

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 ]

2 голосов
/ 20 июня 2020

Это может быть один вариант:

- 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
0 голосов
/ 20 июня 2020

Спасибо за ваши ответы. Вот как я это сделал.

- 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}}"
0 голосов
/ 20 июня 2020

Вложенный l oop должен работать.

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}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...