如何用Ansible实现磁盘使用率<70%时更新代理否则发邮件退出
原有Playbook的核心问题
- 存在拼写错误:变量
ansible_paython_interpreter拼写错误,正确名称为ansible_python_interpreter,会导致Ansible无法正确加载目标节点Python环境 - 磁盘判断逻辑有缺陷:通过
shell模块抓取的df输出是带%的字符串,直接做大小比较会出现判断偏差(比如根分区使用率为9%时,字符串比较逻辑会误判为大于'70%') - 终止逻辑不生效:
failed_when配置在yum更新任务上,当磁盘使用率超阈值时,yum任务会被when条件直接跳过,根本不会触发失败终止;同时全局配置ignore_errors: yes会吞掉所有任务错误,和any_errors_fatal: true的配置完全冲突 - 未实现磁盘超阈值时的邮件通知逻辑,不满足需求
优化实现方案
优化思路:
- 优先使用Ansible自带的facts采集能力获取磁盘数据,无需手动执行shell命令,直接输出数值类型的使用率结果,从根源避免字符串比较的逻辑错误
- 前置磁盘阈值检查,超阈值时先发送告警邮件,再主动终止play执行
- 移除冲突的全局配置,修正拼写错误,保留原有逐台滚动更新(
serial:1)、仅更新RedHat系节点、排除内核更新的逻辑 - 邮件发送任务委托给控制节点执行,无需在目标代理节点部署邮件客户端
优化后的完整Playbook如下:
--- - name: 代理节点系统更新Playbook hosts: proxy become: yes become_method: sudo serial: 1 any_errors_fatal: true gather_facts: yes vars: ansible_python_interpreter: /usr/bin/python # 磁盘使用率阈值 disk_alert_threshold: 70 # 邮件配置项按实际环境修改 smtp_host: your_smtp_server_addr smtp_port: 25 mail_sender: ansible-alert@your-domain.com mail_receiver: ops-team@your-domain.com tasks: - name: 计算根分区磁盘使用率 set_fact: root_usage_pct: "{{ ( (ansible_mounts | selectattr('mount', 'equalto', '/') | map(attribute='size_used') | first) / (ansible_mounts | selectattr('mount', 'equalto', '/') | map(attribute='size_total') | first) * 100 ) | round(1, 'floor') | int }}" - name: 打印当前磁盘使用率 debug: msg: "当前节点{{ inventory_hostname }}根分区使用率为{{ root_usage_pct }}%" - name: 磁盘使用率超阈值时终止流程并告警 block: - name: 发送磁盘不足告警邮件 mail: host: "{{ smtp_host }}" port: "{{ smtp_port }}" from: "{{ mail_sender }}" to: "{{ mail_receiver }}" subject: "[告警] 代理节点{{ inventory_hostname }}磁盘空间不足,更新终止" body: "节点标识:{{ inventory_hostname }}\n根分区当前使用率:{{ root_usage_pct }}%\n阈值:{{ disk_alert_threshold }}%\n系统更新任务已自动终止,请尽快清理磁盘空间后重试。" delegate_to: localhost - name: 终止Play执行 fail: msg: "根分区使用率{{ root_usage_pct }}%超过阈值{{ disk_alert_threshold }}%,终止更新流程" when: root_usage_pct | int >= disk_alert_threshold | int - name: 执行系统更新(排除内核包) yum: name: "*" state: latest exclude: 'kernel*' update_cache: yes update_only: yes when: ansible_os_family == 'RedHat' and root_usage_pct | int < disk_alert_threshold | int register: yum_update_result - name: 打印更新结果 debug: var: yum_update_result
补充说明
- 如果你的环境禁用了facts采集,可以把计算磁盘使用率的任务替换成shell实现,注意输出必须是纯数字:
- name: 通过shell获取根分区使用率 shell: df -h / | tail -n 1 | awk '{gsub(/%/,"",$5);print $5}' register: used_space changed_when: false - name: 赋值使用率变量 set_fact: root_usage_pct: "{{ used_space.stdout | int }}" - 如果没有SMTP邮件服务,可以把邮件发送任务替换成钉钉/企业微信/飞书的webhook告警,逻辑完全一致。
内容的提问来源于stack exchange,提问作者milan patel
相关产品推荐
相关产品推荐

