You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:36:51