Python服务器巡检案例实操:从手动到自动的运维跃迁
文章目录(导读)
- 为什么要用Python做服务器巡检?
- 巡检脚本的核心模块设计
- 实战案例:磁盘、CPU、内存、网络巡检
- 通知与告警:邮件与钉钉机器人推送
- 常见问题与解决方案(Q&A)
- 自动巡检的下一步
为什么要用Python做服务器巡检?
在运维工作中,服务器巡检是日常的“基本功”,传统人工SSH登录执行命令的方式,不仅效率低下,还容易遗漏关键指标,许多团队早期依赖Shell脚本收集信息,但Shell在复杂逻辑处理、数据格式化、异常告警方面能力有限。
Python的优势在于:跨平台、丰富的系统库(psutil、socket、subprocess)、易与监控系统(Prometheus、Zabbix)集成,通过编写Python巡检脚本,我们可以将重复工作自动化,并在指标异常时立即通知。
问答1:巡检脚本需要root权限吗?
不需要严格root,大多数系统信息(如CPU、内存)可通过psutil读取,磁盘信息也可以用户级权限获取,但若需重启服务或读取敏感日志文件,则需sudo权限,建议在巡检脚本中通过os.geteuid()判断权限,并做出让步处理。
巡检脚本的核心模块设计
一个生产级巡检脚本通常包含三个模块:
- 信息采集模块:调用系统API或读取
/proc文件系统,收集CPU使用率、内存剩余、磁盘空间、网络带宽、进程状态等。 - 阈值判断模块:设定告警阈值(如磁盘使用率>80%),若指标超限则记录告警日志。
- 通知模块:通过SMTP发送邮件,或调用Webhook推送钉钉/企业微信消息。
目录结构示例:
server_check/
├── main.py # 主入口
├── collectors/
│ ├── cpu_mem.py
│ ├── disk.py
│ └── network.py
├── utils/
│ ├── alert.py # 通知工具
│ └── config.py # 配置文件
└── logs/
└── check.log
问答2:脚本应该用Python2还是Python3?
必须用Python3,Python2已于2020年停止维护,且psutil等主流库已不再支持2.x,在CentOS 7等较旧系统上,可以通过编译安装Python3或使用EPEL源。
实战案例:磁盘、CPU、内存、网络巡检
1 磁盘巡检(使用psutil)
import psutil
def check_disk():
disk_list = []
for part in psutil.disk_partitions():
if 'loop' in part.device: # 忽略loop设备
continue
usage = psutil.disk_usage(part.mountpoint)
disk_info = {
'mount': part.mountpoint,
'total': usage.total / (1024**3),
'used': usage.used / (1024**3),
'percent': usage.percent
}
if usage.percent > 80:
disk_info['alert'] = True
else:
disk_info['alert'] = False
disk_list.append(disk_info)
return disk_list
2 CPU与内存巡检
def check_cpu_mem():
cpu_percent = psutil.cpu_percent(interval=1) # 1秒采样
mem = psutil.virtual_memory()
swap = psutil.swap_memory()
result = {
'cpu_percent': cpu_percent,
'mem_percent': mem.percent,
'mem_available': mem.available / (1024**3),
'swap_percent': swap.percent
}
# 判定: CPU>90% 或 内存>90% 触发告警
if cpu_percent > 90 or mem.percent > 90:
result['alert'] = True
else:
result['alert'] = False
return result
3 网络与端口检测
检测主机是否存活(ping),以及关键端口(如SSH 22、Web 80/443)是否开放。
import socket
def check_port(host, port, timeout=2):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
result = sock.connect_ex((host, port))
sock.close()
return result == 0 # 0表示端口开放
except Exception:
return False
问答3:为什么使用
connect_ex而不是connect?
connect_ex()返回错误码(0代表成功),不会抛出异常,更适合在批量端口扫描时捕获错误,如果使用connect(),需要包裹try/except捕获ConnectionRefusedError,增加了代码复杂性。
通知与告警:邮件与钉钉机器人推送
1 邮件告警(SMTP)
import smtplib
from email.mime.text import MIMEText
def send_mail(subject, body, to_addrs):
msg = MIMEText(body, 'plain', 'utf-8')
msg['Subject'] = subject
msg['From'] = 'admin@example.com'
msg['To'] = ','.join(to_addrs)
with smtplib.SMTP_SSL('smtp.example.com', 465) as server:
server.login('admin@example.com', 'password')
server.sendmail('admin@example.com', to_addrs, msg.as_string())
2 钉钉机器人(Webhook)
import requests
import json
def send_dingtalk(text):
webhook = 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN'
data = {
"msgtype": "text",
"text": {"content": f"服务器巡检告警:\n{text}"}
}
requests.post(webhook, data=json.dumps(data), headers={"Content-Type": "application/json"})
注意事项:
生产环境中,API Token和密码应通过环境变量或加密配置文件读取,切勿明文写在代码中。
常见问题与解决方案(Q&A)
Q1:psutil的CPU百分比不准确?
A:psutil.cpu_percent()如果不传入interval参数会返回0,必须设置采样间隔(如1秒),同时注意,在多核CPU下该返回的是所有核的平均使用率,若要获取每核数据需用psutil.cpu_percent(percpu=True)。
Q2:巡检脚本如何定时运行?
A:最佳方案是使用Linux的cron定时任务。
*/30 * * * * /usr/bin/python3 /opt/check/main.py >> /var/log/check.log 2>&1
如果需要更复杂的调度(如依赖关系、失败重试),可以考虑使用airflow或celery等任务框架,但对单机巡检而言cron足够。
Q3:如何避免误报(比如临时高负载)?
A:设置“持久化告警”逻辑:连续N次采样都超阈值才触发告警,例如定义alert_count变量,超过3次后才发送通知,也可以在阈值判断中加入“平均值”计算(如最近5分钟的平均CPU > 90%)。
Q4:脚本部署后,如何查看历史巡检结果?
A:建议将每次巡检结果写入JSON或CSV文件,并搭配简单的Web界面(如Flask)展示最近24小时的数据,更轻量的方法:将结果输出到日志文件夹,按日期命名,使用tail -n 5等方式查看最近记录。
自动巡检的下一步
通过本文的案例,你已经掌握了Python服务器巡检的核心技术:数据采集(psutil、socket)、阈值判断、多通道告警(邮件+钉钉)、定时执行(cron),一个稳健的巡检脚本,不仅能降低人工维护成本,还能在故障发生前发出预警。
值得拓展的方向:
- 引入
prometheus_client,将指标暴露给Prometheus,实现可视化趋势图表。 - 集成
influxdb持久化数据,支持多服务器横向扩展。 - 增加自我保护机制:巡检脚本本身如果异常退出(如内存泄漏),应有看门狗自动重启。
最后提醒:不要过度依赖脚本,自动化巡检只是运维体系的“眼睛”,真正处理问题还需要人机协同,建议将告警分级:黄色告警(仅记录)、橙色告警(推送群消息)、红色告警(电话或短信)。
案例可在任何安装了Python3和psutil(pip3 install psutil)的Linux服务器上直接运行,请根据实际环境调整阈值和告警方式。
标签: 自动化巡检