Ansible: сравните словари и создайте новый словарь с результатами

#ansible

Вопрос:

Я хотел бы убедиться, что некоторые требования к ресурсам сервера выполнены или превышены с помощью Ansible, и создать шаблон для сравнения двух наборов данных:

 # data
system_minimum_specs_required:
  memfree_mb: 1000
  equal: 1
  less: 2
  more: 3
 
 # tasks
- name: Set server facts
  set_fact:
    check_name: Spec
    system_minimum_specs:
      memfree_mb: "{{ansible_facts.memfree_mb}}"
      equal: 1
      less: 1
      more: 4

# Compare data
- set_fact:
    "results_min": "{{results_min}}   [{{ item }} is {{ (system_minimum_specs[item] | int  >= system_minimum_specs_required[item] | int)|
                            ternary(true, false) | bool }}]"
  loop: "{{ system_minimum_specs_required.keys()|sort }}"

- debug:
    msg: "results_min[]: {{ results_min }}"
 

Это приводит к следующей отладке:

 TASK [server_checks : set_fact] *********************************************************************************************************************************************************************************
ok: [node1.vozzytech.local] => (item=equal)
ok: [node1.vozzytech.local] => (item=less)
ok: [node1.vozzytech.local] => (item=memfree_mb)
ok: [node1.vozzytech.local] => (item=more)

TASK [server_checks : debug] ************************************************************************************************************************************************************************************
ok: [node1.vozzytech.local] => {
    "msg": "results_min[]: []   [equal is True]   [less is False]   [memfree_mb is False]   [more is True]"
}
 

Что я хотел бы попробовать сделать, так это создать словарь, содержащий следующие данные для отображения в шаблоне:

 {
    "memfree" : {
        "condition" : 1000,
        "actual" : 500,
        "result" : false
    },
    "less" : {
        "condition" : 2,
        "actual" : 1,
        "result" : false
    },
    "more" : {
        "condition" : 3,
        "actual" : 4,
        "result" : true
    }
}

 

Ответ №1:

 - name: add a value to the dictionary
  set_fact: 
    results: "{{
      results | default ([])   
        [{ 
          'name': item, 
          'required': system_minimum_specs_required[item]|int, 
          'actual': system_minimum_specs[item]|int,
          'result' : ( system_minimum_specs[item]|int  >= system_minimum_specs_required[item]|int )|ternary(true, false)|bool
        }] 
      }}"
  with_items: "{{ system_minimum_specs.keys()|sort }}"

- debug:
    msg: "results_min[]: {{ results }}"
 

результаты в:

 TASK [server_checks : debug] ************************************************************************************************************************************************************************************
ok: [node1.vozzytech.local] => {
    "msg": "results_min[]: [{'name': 'equal', 'required': 1, 'actual': 1, 'result': True}, {'name': 'less', 'required': 2, 'actual': 1, 'result': False}, {'name': 'memfree_mb', 'required': 500, 'actual': 545, 'result': True}, {'name': 'more', 'required': 3, 'actual': 4, 'result': True}]"
}