首页 > 解决方案 > 在ansible中迭代字典

问题描述

我在 OpenShift 环境中使用 ansible 从 prometheus 获取数据。我正在创建一个类似于以下输出的字典。现在我需要遍历这个字典来计算 CPU 使用百分比(我知道有 prometheus 指标),比如 cpu_used*100/cpu_total。

我尝试使用with_items:item."anything"失败了!

ok: [127.0.0.1] => {
    "msg": {
        "machine-infra01": {
            "cpu_total": 8,
            "cpu_used": 0.23
        },
        "machine-infra02": {
            "cpu_total": 12,
            "cpu_used": 0.3
        },
        "machine-infra03": {
            "cpu_total": 12,
            "cpu_used": 0.44
        },
        "machine-master01": {
            "cpu_total": 8,
            "cpu_used": 0.21
        }   
    }
}

标签: pythonansibleopenshiftprometheus

解决方案


你可以做这样的事情,它遍历你的字典字典,构建一个包含cpu_percent值的新字典,然后递归地将它与原始值合并:

  vars:
    data: "{{ lookup('file', 'foo.json') | from_json }}"
    percents: {}

  tasks:
    - set_fact:
        percents: "{{ percents | combine({ item.key : { 'cpu_percent': item.value.cpu_used*100/item.value.cpu_total }}) }}"
      with_dict: "{{ data }}"
    - set_fact:
        data: "{{ data | combine(percents, recursive=True) }}"
    - debug:
        var: data

输出:

ok: [localhost] => {
    "data": {
        "machine-infra01": {
            "cpu_percent": 2.875, 
            "cpu_total": 8, 
            "cpu_used": 0.23
        }, 
        "machine-infra02": {
            "cpu_percent": 2.5, 
            "cpu_total": 12, 
            "cpu_used": 0.3
        }, 
        "machine-infra03": {
            "cpu_percent": 3.6666666666666665, 
            "cpu_total": 12, 
            "cpu_used": 0.44
        }, 
        "machine-master01": {
            "cpu_percent": 2.625, 
            "cpu_total": 8, 
            "cpu_used": 0.21
        }
    }
}

推荐阅读