如何使用Ansible Playbook检测Linux磁盘容量是否小于10GB
问题根因
你当前代码的判断逻辑错误来自两个原因:
ansible_facts.devices返回的size字段是带单位的字符串(例如55 MB、20 GB),直接和数字10做比较时,Ansible只会提取字符串开头的数字部分计算,55 MB会被识别为数值55,自然就会误判为大于10输出PASS- 原
set_fact使用循环遍历磁盘时,每次都会覆盖disk_size变量,最终只能拿到最后一块磁盘的检测结果,无法实现所有磁盘的批量检测
修改方案
使用Ansible内置的human_to_bytes过滤器,将所有带单位的容量统一转换为字节数值,再和10GB对应的字节数(10737418240)做比较即可保证判断逻辑准确,同时输出时直接调用原始size字段就能保留原生单位。
完整修改后的Playbook片段
- name: 检测所有磁盘容量 筛选小于10GB的磁盘 debug: msg: > {% set size_in_bytes = item.value.size | human_to_bytes %} {% if size_in_bytes > 10737418240 %} 磁盘 {{ item.key }} 容量 {{ item.value.size }} -> PASS {% else %} 磁盘 {{ item.key }} 容量 {{ item.value.size }} -> FAIL {% endif %} with_dict: "{{ ansible_facts['devices'] }}" ignore_errors: yes tags: get_disk_info
可选优化:仅输出小于10GB的磁盘
如果不需要输出PASS的磁盘,只想筛选出容量不足10GB的磁盘,可以添加when条件过滤:
- name: 仅输出容量小于10GB的磁盘 debug: msg: "磁盘 {{ item.key }} 容量不足10GB,当前容量:{{ item.value.size }}" with_dict: "{{ ansible_facts['devices'] }}" when: item.value.size | human_to_bytes < 10737418240 ignore_errors: yes tags: get_disk_info
内容的提问来源于stack exchange,提问作者Suganthan Raj
相关产品推荐
相关产品推荐

