Python服务器巡检案例实操?

wen python案例 3

Python服务器巡检案例实操:从手动到自动的运维跃迁

文章目录(导读)

  1. 为什么要用Python做服务器巡检?
  2. 巡检脚本的核心模块设计
  3. 实战案例:磁盘、CPU、内存、网络巡检
  4. 通知与告警:邮件与钉钉机器人推送
  5. 常见问题与解决方案(Q&A)
  6. 自动巡检的下一步

为什么要用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百分比不准确?

Apsutil.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

如果需要更复杂的调度(如依赖关系、失败重试),可以考虑使用airflowcelery等任务框架,但对单机巡检而言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服务器上直接运行,请根据实际环境调整阈值和告警方式。

标签: 自动化巡检

抱歉,评论功能暂时关闭!