一、摘要
我用 TRAE SOLO 开发了 Patrol —— 一款轻量级、可配置的系统巡检工具。它通过 SSH 自动采集多台服务器状态,一键生成 HTML/JSON/TXT 多格式报告,支持并发巡检和跨系统兼容(Redhat系、Debian系验证,其他Linux应该也支持)。目标是让运维人员从每天重复的“敲命令、盯屏幕”中解放出来。
二、背景
我是一名“IT老兵”,从研发转运维,日常维护多台服务器。传统巡检方式:手动 SSH 登录每台机器 → 敲命令 → 肉眼判断异常 → 记录结果。耗时、重复、容易遗漏 。生产环境对安装第三方软件有严格限制,我需要一个纯 Shell、无侵入、可配置 的自动化工具。这次借助 TRAE SOLO,目标是快速搭建一个可落地的巡检框架。
三、实践过程
任务拆解
我将整个工具拆解为五个核心模块:
-
配置管理:通过 group 标签统一管理服务器和检查项
-
远程执行:SCP 上传脚本 + SSH 执行,采集数据
-
结果解析:远程脚本直接输出 JSON,中心机合并
-
报告生成:输出 HTML/TXT 报告
-
告警判断:支持 CPU/内存/磁盘的警告/严重阈值
与 SOLO 的协作流程
1. 架构设计阶段
我向 SOLO 提问:
“我需要一个 Shell 脚本,能够读取 servers.conf、check_groups.conf、checks.conf,批量 SSH 执行采集,生成报告。”
SOLO 生成了清晰的目录结构和主框架。
2. 核心功能迭代
-
并发控制:SOLO 实现了
&+wait的并行执行,性能提升 3 倍 -
JSON 输出:使用
jq构建结构化数据 -
HTML 报告:带表格和颜色标记
3. 踩坑与解决
-
变量名冲突:SOLO 使用了
GROUPS,但这是 Bash 内置变量,改为GROUP_NAMES解决 -
换行符问题:
\n变成字面量,改用$'\n'解决 -
子 shell 变量丢失:管道导致变量无法传递,改用
<<<重定向 -
跨系统兼容:Debian 和 Rocky Linux 命令输出格式差异,用
sed按关键字提取
关键 Prompt 示例
-
“请修改 patrol.sh,增加
--parallel参数控制并发数” -
“remote_collector.sh 中 CPU 使用率在 Debian 上显示为 0,请修复”
-
“请添加磁盘告警阈值,支持警告和严重两级”
四、成果展示
项目结构
patrol/
├── patrol.sh # 主调度脚本
├── remote_collector.sh # 远程数据采集脚本
├── install.sh # 安装脚本
├── conf/ # 配置目录
│ ├── servers.conf # 服务器配置
│ ├── servers.conf.example # 服务器配置示例
│ ├── checks.conf # 检查项配置
│ ├── checks.conf.example # 检查项配置示例
│ ├── check_groups.conf # 检查项分组配置
│ └── check_groups.conf.example # 检查项分组配置示例
├── logs/ # 日志目录
├── bin/ # 二进制工具目录(如 jq)
└── web/ # 前端页面目录
├── index.html # 报告列表页面
├── report.html # 概览报告页面
├── report_detailed.html # 详细报告页面
├── trend.html # 趋势分析页面
├── css/ # 样式文件
├── js/ # JavaScript 文件
├── data/ # 报告数据目录
└── demo_data/ # 演示数据目录
运行结果
-
成功采集多台服务器
-
覆盖 CPU、内存、磁盘、进程、Docker 检查
-
生成 JSON + HTML + TXT 报告
代码仓库: GitHub - uncleask/patrol: 轻量级分布式系统巡检工具 · GitHub
五、 效果与总结
提效成果:10 台服务器巡检从半小时 → 2 分钟
SOLO 协作:生成 80% 代码框架,修复 10+ 个 Bash 细节问题
可复用方法:配置与代码分离、group 标签管理、跨系统兼容处理
六、实践结果
本项目全程使用 TRAE SOLO,协作模式包括:
- 需求拆解:向 SOLO 描述巡检场景,生成项目骨架
- 代码迭代:通过多轮对话修正 Shell 兼容性问题(如
GROUPS变量冲突、跨系统top输出差异) - 踩坑修复:SOLO 帮助解决了子 shell 变量丢失、换行符字面量等问题
- 前端开发:SOLO 生成 HTML 报告模板和趋势分析页面
七、附录
网盘分享
链接:夸克网盘分享
提取码:BDd1













