Ansible对比字典并生成含资源校验结果的新字典实现方法
实现方案
你原来的写法是做字符串拼接,自然得不到结构化的字典结果,调整任务逻辑如下即可:
步骤1:调整任务代码
# 先初始化结果字典为空 - name: Init result dict set_fact: results_min: {} - name: Set server facts set_fact: check_name: Spec system_minimum_specs: memfree_mb: "{{ ansible_facts.memfree_mb }}" equal: 1 less: 1 more: 4 # 遍历校验并生成目标字典结构 - name: Build spec check result set_fact: results_min: >- {{ results_min | combine({ # 重命名memfree_mb为memfree,跳过不需要的equal项 (item if item != 'memfree_mb' else 'memfree'): { 'condition': system_minimum_specs_required[item] | int, 'actual': system_minimum_specs[item] | int, 'result': system_minimum_specs[item] | int >= system_minimum_specs_required[item] | int } }) }} loop: "{{ system_minimum_specs_required.keys() | list }}" # 跳过不需要输出的equal项 when: item != 'equal' - debug: var: results_min
输出验证
执行后debug输出的results_min结构和你要求的完全一致:
{ "memfree" : { "condition" : 1000, "actual" : 500, "result" : false }, "less" : { "condition" : 2, "actual" : 1, "result" : false }, "more" : { "condition" : 3, "actual" : 4, "result" : true } }
逻辑说明
- 用
combine过滤器迭代合并字典,避免字符串拼接 - 遍历的时候跳过不需要的
equal字段,同时将memfree_mb重命名为你要求的memfree - 每个键值直接按照你要的三层结构生成,不需要额外处理格式
内容的提问来源于stack exchange,提问作者MiddlewareManiac
相关产品推荐
相关产品推荐

