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
}
}
解决方案
- 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}]"
}
推荐阅读
- r - 错误问题:无法修改列“组”,因为它是一个分组变量
- python - 如何在Python的正则表达式中获取列表的所有元素
- python - 根据其他列内容在 pandas df 中创建新列时出现 np.where 问题
- c# - 在 C# 中加载用 python 构建的 keras 模型?
- model-view-controller - 如何在表格中添加我的文本框项目?以主明细形式
- sql-server - 希望在客户表中拥有每个客户的最高价格和日期-
- idl-programming-language - 如何保存循环结果并将它们保存在新数组中?
- kotlin - runBlocking Coroutine 不会阻止 GlobalScope.launch (?)
- javascript - 按所有键分组并聚合对象数组
- java - 为什么执行器服务比 java 8 中的顺序操作花费更多时间?