如何用Ansible检查Windows服务器磁盘大小并配置告警?
解决Windows服务器磁盘大小检查的Ansible条件判断问题
原代码存在的问题
- 重复调用
win_disk_facts,属于冗余操作 - D盘检查的
when条件逻辑完全错误:原条件是「当disks[1].size未定义时执行」,但实际需求是「D盘存在时才执行检查」,且when语句内无需用{{}}包裹变量 - 直接通过索引
disks[0]/disks[1]匹配C/D盘不可靠,磁盘顺序会因服务器配置不同变化,必须通过盘符精准匹配
修正后的完整Playbook
- name: Windows服务器磁盘大小检查 hosts: '{{ servers }}' become: false gather_facts: false vars: # 定义磁盘规格阈值(单位:GB),可按需修改 disk_specs: C: 50 D: 100 tasks: - name: 获取磁盘分区信息 tags: disk community.windows.win_disk_facts: filter: partitions - name: 检查C盘大小是否达标 ansible.builtin.fail: msg: "告警:C盘当前大小为{{ c_disk_size }}GB,低于阈值{{ disk_specs.C }}GB" vars: # 按盘符筛选C盘,转换大小为GB并取整 c_disk: "{{ ansible_facts.disks | selectattr('drive_letter', 'equalto', 'C') | first }}" c_disk_size: "{{ (c_disk.size / 1024**3) | round | int }}" when: c_disk_size < disk_specs.C - name: 检查D盘大小(仅当D盘存在时执行) ansible.builtin.fail: msg: "告警:D盘当前大小为{{ d_disk_size }}GB,低于阈值{{ disk_specs.D }}GB" vars: # 筛选D盘,无D盘则返回空列表 d_disk_list: "{{ ansible_facts.disks | selectattr('drive_letter', 'equalto', 'D') | list }}" d_disk: "{{ d_disk_list[0] if d_disk_list | length > 0 else None }}" d_disk_size: "{{ (d_disk.size / 1024**3) | round | int if d_disk else 0 }}" when: - d_disk is not none - d_disk_size < disk_specs.D
关键说明
- 精准匹配磁盘:通过
selectattr('drive_letter', 'equalto', 'X')按盘符筛选磁盘,彻底避免索引顺序错误 - 告警触发逻辑:用
fail模块替代debug,磁盘不达标时任务直接失败并输出告警信息,在Ansible运行过程中直观触发告警 - D盘存在性判断:先将筛选结果转为列表,通过列表长度判断D盘是否存在,避免访问不存在的变量引发报错
- 阈值可配置:把磁盘规格定义在
vars区块,后续修改阈值只需调整disk_specs,无需改动任务逻辑
内容的提问来源于stack exchange,提问作者jeszi
相关产品推荐
相关产品推荐

