首页 > 解决方案 > 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
    }
}

标签: ansible

解决方案


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

推荐阅读