Linux监控平台演进:从Shell脚本到Python Flask集中管控
摘要:在日常运维中,你是否常面临“磁盘爆了才去清,服务挂了才去重启”的救火困境?Zabbix、Prometheus 虽好,但部署重、配置繁琐。本文将带你跳出舒适区,通过“Shell脚本优化 -> Python逻辑封装 -> Flask集中管控”的三级跳,构建一套轻量级、可视化的自动化运维平台。
详细内容请查阅下文。
一、基石构建:Shell脚本的“去伪存真”
运维脚本之所以不可靠,是因为只写了“正常逻辑”,忽略了“异常边界”。所以,在生产环境中,我们需要更严谨的判断。
1. 报警服务:拒绝重复造轮子
痛点:每个脚本里都写一遍SMTP配置,改个邮箱要改十遍。
优化方案:将报警功能封装为独立函数或公共脚本。
案例:
# send_alert.shMAIL_TO="17587257@qq.com"send_alert() {localsubject=$1localmessage=$2#生产环境建议配置 s-nail 或 sendmail 以提高成功率echo"$message" | mail -s "$subject" "$MAIL_TO"}
2. 负载监控:引入“动态阈值”与“防抖动”
痛点:固定阈值(如 load > 5)在32核机器上是正常,在2核机器上就是灾难。且瞬时尖峰容易引发误报。
优化方案:
动态阈值:阈值 = CPU核心数 × 1.5。
防抖动:连续3次检查均超标才报警。
案例:
# check_load_pro.shCORES=$(grep -c 'model name' /proc/cpuinfo)THRESHOLD=$(echo "$CORES * 1.5" | bc)LOAD=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | tr -d ',')# 使用 bc 进行浮点数比较IS_HIGH=$(echo "$LOAD > $THRESHOLD" | bc)if [ "$IS_HIGH" -eq 1 ]; thensend_alert"【严重】系统负载过高" "当前: $LOAD (阈值: $THRESHOLD)"fi
备注:使用 awk 和 tr 处理 uptime 输出,去除逗号干扰。
3. 服务监控:从“发现”到“自愈”
痛点:监控发现了Nginx挂了,发邮件给运维,运维起床重启,业务已中断半小时。
优化方案:引入“看门狗”机制。发现停止 -> 尝试重启 -> 重启失败再报警。
案例:
# check_service_pro.shSERVICES=("nginx" "mysqld")for SERVICE in "${SERVICES[@]}"; doif! systemctl is-active --quiet "$SERVICE"; thensystemctlrestart "$SERVICE"sleep3#二次检查,若仍失败则报警if! systemctl is-active --quiet "$SERVICE"; thensend_alert"【紧急】自愈失败" "服务 $SERVICE 重启失败,请人工介入!"fifidone
二、核心升级:Python赋能,统一监控逻辑
当我们需要汇总数据、跨服务器关联分析时,Python 的 psutil 库比 Shell 更高效、更跨平台。Psutil是一个跨平台的 Python 库,用于获取正在运行的进程和系统资源(如 CPU、内存、磁盘、网络)的使用信息,可以把它看作是 Python 中一个强大的“系统监控工具箱”。
架构设计
案例:
# monitor_center.pyimport psutilclass SystemMonitor:defcheck_cpu_load(self):load_1,_, _ = psutil.getloadavg()cpu_count= psutil.cpu_count()load_percent= (load_1 / cpu_count) * 100ifload_percent > 150: # 阈值 150%print(f"CPU负载过高: {load_1}")defcheck_disk_usage(self):#过滤掉 PermissionError,防止脚本中断forpartition in psutil.disk_partitions():try:usage= psutil.disk_usage(partition.mountpoint)ifusage.percent > 85:print(f"磁盘空间不足:{partition.mountpoint}")exceptPermissionError:continue
备注:Python 解决了 Shell 逻辑处理能力弱的问题,但单机脚本依然存在“信息孤岛”。我们需要一个中心化的“驾驶舱”。
三、架构演进:基于 Flask 构建集中式监控平台
当服务器达到几十上百台,逐台登录查看日志是不现实的。我们需要 Agent + Server 模式。
1. Agent端:让服务器“开口说话”
在被监控服务器部署轻量级 Flask 应用,暴露 API 接口。
关键优化点:
案例:
# agent.pyfrom flask import Flask, jsonify, requestimport psutil, socket, subprocessapp = Flask(__name__)API_KEY = "your-secret-key-here" # 生产环境请使用环境变量def get_local_ip():s= socket.socket(socket.AF_INET, socket.SOCK_DGRAM)try:s.connect(("8.8.8.8",80))ip= s.getsockname()[0]exceptException:ip= "127.0.0.1"finally:s.close()returnip@app.route('/api/status')def api_status():returnjsonify({"hostname":socket.gethostname(),"ip":get_local_ip(),"cpu_load":psutil.getloadavg()[0],"memory":psutil.virtual_memory().percent})@app.route('/api/restart_service/', methods=['POST'])def api_restart_service(service_name):#1. 鉴权ifrequest.headers.get('X-API-Key') != API_KEY:returnjsonify({"status": "error", "msg": "未授权"}), 403#2. 防注入ifnot service_name.isalnum():returnjsonify({"status": "error", "msg": "非法字符"}), 400#3. 执行subprocess.run(["sudo","systemctl", "restart", service_name], timeout=10)returnjsonify({"status": "success"})
2. Server端:打造统一仪表盘
监控中心定时轮询所有 Agent,汇总数据并展示。
关键优化点:
案例:
# dashboard.pyfrom flask import Flask, render_template_stringimport requests, threading, timeapp = Flask(__name__)TARGET_SERVERS = ["http://192.168.1.10:5000/api/status", "..."]MONITOR_DATA = []def fetch_data():whileTrue:temp_data= []forurl in TARGET_SERVERS:try:resp= requests.get(url, timeout=5)temp_data.append(resp.json())except:temp_data.append({"hostname":url, "error": "节点离线"})globalMONITOR_DATAMONITOR_DATA= temp_datatime.sleep(10)# 启动后台采集线程threading.Thread(target=fetch_data, daemon=True).start()@app.route('/')def index():#此处省略HTML模板代码,核心逻辑是渲染 MONITOR_DATAreturnrender_template_string(HTML_TEMPLATE, hosts=MONITOR_DATA)
关键结论:通过 Agent + Server 架构,我们实现了从“单机脚本”到“集群管控”的跨越。新增服务器只需部署 Agent,无需修改中心代码,扩展性极强。
四、系统的启动与使用
1.启动系统
执行指令# python3 app.py启动系统

2.使用系统
第一步:使用浏览器访问https://172.16.27.49/ 查看平台首页(这里有两台监控主机)。如下图

第二步:切换【服务器管理】页面,查看已经添加的服务器列表

添加监控服务器。如下图

保存后回到监控服务器列表。(这里已经有三台监控主机)。如下图

保存后返回监控平台首页。如下图

第四步:切换【系统告警】页面。如下图

第五步:切换【AI智能体】页面。如下图

第六步:切换【帮助中心】页面。如下图

五、避坑指南与经验总结
在实施上述方案时,请务必注意以下生产环境细节:
1.权限管理
Agent 执行 systemctl restart 需要 root 权限。建议根据实际需要配置/etc/sudoers 文件,仅允许特定用户无密码重启特定服务,避免赋予脚本过高的系统权限。
2.依赖安装
3.后台运行
使用 nohup python3 agent.py > nohup.out 2>&1 & 命令启动 Agent服务。
4.HTTPS加密
Python程序涉及敏感数据,建议在生产环境务必配置 SSL 证书(ssl_context),防止数据明文传输。
📢 总结与分享
纸上得来终觉浅,绝知此事要躬行。Shell 是 Linux 的敲门砖,而 Python 则是赋予其智能的翅膀。希望大家在掌握这些基础指令后,能着手去设计属于自己的监控平台,在一次次的调试与优化中,体会驾驭 Linux 系统的真正乐趣与成就感。
如果本文对您有帮助,欢迎:
1.👍 点赞,鼓励更多Python实战内容。
2.💬 留言,交流你在系统运维中遇到的痛点。
3.🔄 转发,希望大家都能够在Linux系统中打造属于自己的自动化监控平台,以提高团队的工作效率。