我给运维告警接了个 AI 大脑,它现在能自己修服务器了

0 阅读6分钟

摘要:凌晨三点被告警叫醒,清日志、重启服务、Kill 进程——这些重复了无数遍的操作,能不能让 AI 自动干了?本文分享我们开源项目 VigilOps 的 AI 自动修复模块从设计到落地的实战经验,包括踩过的坑和安全机制设计。目前支持 6 个自动修复场景,dry_run 观察期中。


我给运维告警接了个 AI 大脑,它现在能自己修服务器了

先说结论

我们做了一个开源的 AI 运维平台 VigilOps,最近上线了自动修复模块——收到告警后,AI 自动诊断根因、匹配修复方案、执行修复。

目前支持 6 个场景:磁盘清理、日志轮转、服务重启、僵尸进程清理、内存压力处理、连接重置

重要说明:模块刚开发完,正在 dry_run 观察期,还没有真实运营数据。下面聊的是设计思路和踩过的坑,不是吹效果。


为什么要做这个

做运维的都懂——不怕复杂故障,怕的是简单问题反复叫你。

凌晨三点被叫醒清日志,这事一个月来三次,每次操作一模一样。你写了脚本,但脚本需要人触发。配了 cron,但 cron 不知道什么时候该跑。

自动化做了 90%,最后 10% 还是人在跑。偏偏那 10% 在凌晨三点。

2025 年 DeepSeek 等大模型已经能理解上下文、做判断了。我们就想:能不能在监控和脚本之间加个 AI,让它来判断"现在该跑哪个脚本"?


整体架构

一句话:监控出告警 → AI 分析根因 → 匹配 Runbook → 自动执行 → 验证恢复

内置告警引擎 → Agent 编排器 → DeepSeek 诊断 → Runbook 匹配 → 执行修复 → 验证
                                                                    ↓ 失败
                                                              升级人工介入

核心模块就四个文件:

  • agent.py:编排器,串整个流程
  • ai_client.py:调 DeepSeek API 做诊断
  • runbook_registry.py:6 个 Runbook 的注册和匹配
  • command_executor.py:执行命令,默认 dry_run

踩过的坑

坑 1:大模型幻觉导致误操作

早期测试时 DeepSeek 会"编"根因——明明是日志撑爆磁盘,它诊断成"数据库锁竞争",然后建议重启数据库。

解法:Runbook 白名单制。不管 DeepSeek 建议什么,最终只能执行已注册的 6 个 Runbook。大模型的角色是"建议",不是"命令"。

def match(self, alert, diagnosis):
    # AI 建议优先,但必须是已注册的 runbook
    if diagnosis.suggested_runbook:
        runbook = self._runbooks.get(diagnosis.suggested_runbook)
        if runbook:
            return runbook
        # AI 建议了一个不存在的 runbook?忽略,走规则匹配
        logger.warning("AI suggested unknown runbook: %s",
                      diagnosis.suggested_runbook)

    # 退化到告警类型匹配 → 关键词匹配
    ...

教训:永远不要让大模型直接控制执行层。中间必须有一道"翻译 + 校验"。

坑 2:自动修复变成自动破坏

想象一下:AI 判断某个进程占内存太多,Kill 了它——结果那是数据库主进程。

解法:四道安全防线。

  1. 禁令列表rm -rf /DROP DATABASE 这种绝对禁止
  2. 白名单:只有 6 个 Runbook 里定义的命令可以执行
  3. 频率限流:同一台机器同一个 Runbook,N 分钟内不重复
  4. 熔断:连续失败达阈值,停止自动修复,通知人工

而且默认 dry_run——新部署不会真的执行任何命令,只记录"如果放开,我会做什么"。

class CommandExecutor:
    def __init__(self, dry_run: bool = True):  # 注意默认值
        self.dry_run = dry_run

教训:自动化系统的默认状态应该是"不动",而不是"动"。

坑 3:告警风暴下的连锁反应

一台机器挂了,瞬间来 20 条告警——CPU 高、内存高、服务不可用、连接超时...

如果每条告警都触发一个 Runbook,可能同时重启 5 个服务、清 3 次磁盘、Kill 一堆进程。

解法:限流 + 去重。同一台主机的告警在时间窗口内合并处理,同一个 Runbook 不重复触发。


六个 Runbook 详解

这是目前全部实际支持的场景,不多不少:

1. 磁盘清理 disk_cleanup 最高频场景。识别大文件/过期日志/临时文件 → 安全删除 → 验证空间释放。

2. 日志轮转 log_rotation 日志增长过快时自动调整轮转策略,压缩归档旧日志。

3. 服务重启 service_restart 服务异常时先查日志判断根因,简单问题(OOM等)自动重启,复杂问题标记给人。

4. 僵尸进程清理 zombie_killer 检测 Z 状态进程并清理,防止 PID 耗尽。

5. 内存压力处理 memory_pressure 内存告警时识别大内存进程,判断泄漏可能,必要时清缓存或重启服务。

6. 连接重置 connection_reset 连接数异常时清理问题连接。

没有的就是没有——比如 SSL 证书续签、数据库慢查询自动优化(如自动加索引、SQL 改写),这些在规划中但还没实现。不过数据库慢查询监控已经实现了——采集慢查询数量、Top 10 详情展示都有。我们不会把规划当功能写。

告警通知:推到你用的 IM

修复结果不会只躺在日志里。VigilOps 内置 5 种通知渠道:Webhook / 邮件(aiosmtplib)/ 钉钉 / 飞书 / 企业微信。告警、修复结果、升级通知——直接推到你团队日常用的沟通工具,不用盯监控面板。


一个完整的告警处理流程

以最常见的磁盘告警为例:

1. VigilOps Agent 检测到 /var/log 磁盘使用率 > 85%
2. 内置告警引擎触发告警
3. Agent 采集上下文:磁盘各目录大小、最近写入频率、历史处理记录
4. DeepSeek 分析:"Nginx 访问日志 3 天未轮转,占用 12GB,建议执行 disk_cleanup"
5. RunbookRegistry.match() → 命中 disk_cleanup
6. 安全检查通过(白名单✓、限流✓、熔断✓)
7. 执行清理:删除 7 天前的压缩日志,清理 /tmp
8. 验证:磁盘使用率降到 62%
9. 写入 remediation_logs,通知运维

整个过程不需要人参与。但如果任何一步失败——安全检查不通过、清理后空间没释放、AI 诊断不确定——都会升级给人工。


部署体验

Docker Compose 一键拉起:

git clone https://github.com/LinChuang2008/vigilops.git
cd vigilops
cp .env.example .env  # 填入 DeepSeek API Key
docker compose up -d

技术栈:FastAPI + React + PostgreSQL + Redis + DeepSeek API。面向中小团队(管理 5-50 台服务器的运维/SRE 团队),没有奇怪的依赖,标准 Python 项目。


当前状态和规划

坦诚说:

  • ✅ 代码开发完成,6 个 Runbook 可用
  • ✅ 安全机制完整(禁令 + 白名单 + 限流 + 熔断 + dry_run)
  • 🔄 目前处于 dry_run 观察期,还没有在生产环境真正执行过自动修复
  • 🎯 设计目标是覆盖 70% 的常见运维告警,但这需要实际验证

规划中(尚未实现):

  • 更多 Runbook:SSL 证书续签、容器编排异常等
  • 从人工处理记录中自动学习生成新 Runbook

最后

AI 运维不是要替代运维工程师。它处理的是你做过十几遍、闭着眼都能做、但每次还得亲自来的事。

你做架构优化,它做告警值班。分工,不是替代。

如果你也在被凌晨三点的告警折磨,或者在探索 AI 运维自动化,欢迎来看看代码、提 Issue、一起讨论。

🔗 GitHub: github.com/LinChuang20…


你们团队现在的告警处理流程是什么样的?有没有试过自动化修复?欢迎在评论区聊聊。

作者:VigilOps 团队