python - 在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
}
}
}
解决方案
你可以做这样的事情,它遍历你的字典字典,构建一个包含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
}
}
}