运维工程师必备的8个Python自动化脚本(附完整源码下载)

第一章:运维自动化脚本Python案例概述

在现代IT基础设施管理中,运维自动化已成为提升效率、减少人为错误的核心手段。Python凭借其简洁的语法和丰富的库支持,成为编写运维脚本的首选语言。本章将介绍多个实用的Python自动化案例,涵盖系统监控、日志分析、批量部署等典型场景,帮助运维人员快速构建可复用的工具链。

自动化任务的典型应用场景

  • 服务器资源监控:定期采集CPU、内存、磁盘使用率
  • 日志文件轮转与分析:自动归档旧日志并提取关键错误信息
  • 配置批量更新:通过SSH远程修改多台主机的配置文件
  • 服务健康检查:定时检测关键服务状态并触发告警

基础监控脚本示例

以下是一个使用psutil库采集系统信息的简单脚本:
# monitor_system.py
import psutil
import time

def collect_system_metrics():
    # 获取CPU使用率(每秒采样一次)
    cpu_usage = psutil.cpu_percent(interval=1)
    # 获取内存使用情况
    memory_info = psutil.virtual_memory()
    # 获取根分区磁盘使用率
    disk_usage = psutil.disk_usage('/')

    return {
        'cpu_percent': cpu_usage,
        'memory_total_gb': memory_info.total / (1024**3),
        'memory_used_percent': memory_info.percent,
        'disk_used_percent': disk_usage.percent
    }

# 执行数据采集并打印
metrics = collect_system_metrics()
for key, value in metrics.items():
    print(f"{key}: {value}")
该脚本通过调用psutil提供的跨平台接口,统一获取各类系统指标,输出结果可用于后续的告警判断或持久化存储。

常用Python库对比

库名称主要用途特点
psutil系统资源监控跨平台,支持CPU、内存、网络等指标采集
paramikoSSH远程操作实现安全的远程命令执行与文件传输
logging日志记录内置模块,支持分级日志输出

第二章:系统监控与资源管理脚本实践

2.1 系统CPU、内存使用率实时监控原理与实现

系统资源的实时监控是保障服务稳定性的基础。通过操作系统提供的接口采集CPU和内存数据,结合轮询机制可实现高效的性能追踪。
数据采集原理
Linux系统中,/proc/stat/proc/meminfo文件记录了CPU使用时间和内存状态。通过解析这些虚拟文件,可计算出实时使用率。
// 示例:Go语言读取CPU使用率
func readCPUUsage() (float64, error) {
    file, _ := os.Open("/proc/stat")
    defer file.Close()
    scanner := bufio.NewScanner(file)
    if scanner.Scan() {
        parts := strings.Fields(scanner.Text())
        user, _ := strconv.ParseFloat(parts[1], 64)
        system, _ := strconv.ParseFloat(parts[3], 64)
        idle, _ := strconv.ParseFloat(parts[4], 64)
        total := user + system + idle
        // 返回非空闲占比
        return (user + system) / total * 100, nil
    }
    return 0, fmt.Errorf("无法读取CPU数据")
}
该函数读取/proc/stat首行,提取用户态、系统态和空闲时间,通过比例计算得出CPU使用率。
监控频率与精度平衡
  • 采样间隔过短增加系统负载
  • 间隔过长导致数据滞后
  • 推荐1-3秒为采样周期

2.2 磁盘空间自动预警脚本设计与部署

在大规模服务器运维中,磁盘空间的实时监控至关重要。为避免因存储耗尽导致服务中断,需构建自动化预警机制。
脚本核心逻辑设计
使用Shell编写轻量级检测脚本,定期采集文件系统使用率并触发阈值告警:
#!/bin/bash
THRESHOLD=80
USAGE=$(df / | grep / | awk '{print $5}' | sed 's/%//')

if [ $USAGE -gt $THRESHOLD ]; then
  echo "警告:根分区使用率达 ${USAGE}%,请及时处理!" | mail -s "磁盘告警" admin@example.com
fi
该脚本通过 df 获取挂载点使用率,awk 提取百分比数值,当超过预设阈值(80%)时,调用 mail 发送告警邮件。
定时任务部署
利用 cron 实现每10分钟轮询检测:
  • 编辑定时任务:crontab -e
  • 添加执行规则:*/10 * * * * /opt/scripts/disk_monitor.sh
通过系统级调度保障检测连续性,实现无人值守运维。

2.3 进程状态检测与异常进程自动重启方案

在高可用系统架构中,保障关键进程持续运行至关重要。通过定期检测进程状态并实现异常自动重启,可显著提升服务稳定性。
进程状态监控机制
采用轮询方式检查目标进程的PID是否存在,并结合资源使用率判断其健康状态。以下为基于Shell的检测脚本示例:

#!/bin/bash
PROCESS_NAME="my_service"
if pgrep -x "$PROCESS_NAME" > /dev/null; then
    echo "Process is running."
else
    echo "Process not found. Restarting..."
    systemctl start $PROCESS_NAME
fi
该脚本通过pgrep命令查找指定进程名,若未找到则调用systemctl启动服务。需配合cron定时任务每分钟执行一次。
自动恢复策略配置
使用systemd可实现更可靠的守护机制。在服务单元文件中设置:
  • Restart=always:始终重启
  • RestartSec=5:延迟5秒后重启
  • StartLimitInterval=60:限制单位时间内的重启次数

2.4 日志文件轮转与清理自动化策略

在高并发系统中,日志文件迅速膨胀会占用大量磁盘空间,影响系统稳定性。因此,必须建立自动化的日志轮转与清理机制。
使用 logrotate 实现日志轮转
Linux 系统常用 logrotate 工具进行日志管理。配置示例如下:

/var/log/app/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 644 root root
}
该配置表示:每日轮转一次日志,保留7个历史版本,启用压缩,若日志文件缺失也不报错,且保持权限为644。
自动化清理策略
  • 设置基于时间的保留策略(如仅保留最近7天)
  • 结合cron定时任务执行清理脚本
  • 监控磁盘使用率,触发阈值时主动清理旧日志
通过合理配置,可实现日志生命周期的全自动管理,降低运维负担。

2.5 主机健康检查脚本集成与定时任务配置

健康检查脚本设计
主机健康检查脚本通常监测CPU、内存、磁盘及服务状态。以下为一个基础Shell脚本示例:
#!/bin/bash
# health_check.sh - 检查系统关键指标
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
MEM_USAGE=$(free | grep Mem | awk '{printf("%.2f", $3/$2 * 100)}')
DISK_USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')

if (( $(echo "$CPU_USAGE > 80" | bc -l) )); then
  echo "CRITICAL: CPU usage is ${CPU_USAGE}%"
fi

if [ $MEM_USAGE -gt 80 ]; then
  echo "CRITICAL: Memory usage is ${MEM_USAGE}%"
fi

if [ $DISK_USAGE -gt 85 ]; then
  echo "CRITICAL: Disk usage is ${DISK_USAGE}%"
fi
该脚本通过topfreedf获取实时资源使用率,设定阈值触发告警。
定时任务配置
使用cron实现周期性执行,编辑crontab:
*/5 * * * * /opt/scripts/health_check.sh >> /var/log/health.log 2>&1
每5分钟运行一次,并将输出记录至日志文件,便于后续分析与告警集成。

第三章:网络服务自动化操作实战

3.1 使用Python检测服务器端口连通性并告警

在运维自动化中,及时掌握服务器端口状态至关重要。Python凭借其简洁的语法和丰富的网络库,成为实现端口检测的理想工具。
使用socket检测端口连通性
import socket
import time

def check_port(host, port, timeout=3):
    try:
        sock = socket.create_connection((host, port), timeout)
        sock.close()
        return True
    except (socket.timeout, ConnectionRefusedError):
        return False
该函数通过socket.create_connection尝试建立TCP连接,若成功则说明端口开放。参数timeout控制连接超时时间,避免长时间阻塞。
集成告警机制
可结合邮件或消息队列,在检测失败时触发告警。例如每5秒轮询一次目标服务:
  • 连通失败时记录日志并发送告警
  • 恢复后发送恢复正常通知
通过循环调用check_port,实现持续监控,保障服务高可用性。

3.2 自动化SSH远程命令执行与结果收集

在运维自动化场景中,批量执行远程命令并收集返回结果是核心需求之一。通过SSH协议可安全地连接目标主机,实现无需人工干预的指令下发。
使用Paramiko执行远程命令
import paramiko

def run_command(hostname, user, key_file, command):
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(hostname, username=user, key_filename=key_file)
    stdin, stdout, stderr = client.exec_command(command)
    output = stdout.read().decode()
    error = stderr.read().decode()
    client.close()
    return output, error
上述代码利用Paramiko库建立SSH连接,exec_command方法异步执行远程命令,分别捕获标准输出与错误信息,适用于轻量级批量操作。
并发控制与结果聚合
  • 使用Python多线程或concurrent.futures管理大量主机连接
  • 将返回结果结构化存储至字典或JSON文件,便于后续分析
  • 设置超时机制避免连接阻塞
合理配置并发数可提升执行效率,同时避免网络资源耗尽。

3.3 HTTP服务状态监控与故障自动恢复

在分布式系统中,HTTP服务的稳定性直接影响用户体验。为保障服务高可用,需构建实时监控与自动恢复机制。
监控指标采集
关键指标包括响应码、延迟、请求成功率和连接数。通过Prometheus定期抓取目标端点的健康数据:

targets:
  - http://api.service.com/health
  - http://admin.service.com/status
上述配置使监控系统每30秒轮询一次健康接口,异常连续三次则触发告警。
自动恢复策略
当检测到服务不可用时,执行预定义恢复流程:
  1. 重启应用容器
  2. 切换流量至备用实例
  3. 发送告警通知运维人员
结合Kubernetes的livenessProbe可实现自动化重启:

livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10
该配置确保服务异常时自动重建Pod,显著提升系统自愈能力。

第四章:批量运维与配置管理脚本应用

4.1 批量主机信息采集脚本开发与优化

在大规模服务器管理场景中,高效获取主机基础信息是运维自动化的第一步。使用Python结合多线程与SSH并发连接,可显著提升采集效率。
基础采集逻辑实现
import paramiko
import threading

def get_host_info(ip, username, password):
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        client.connect(ip, port=22, username=username, password=password, timeout=5)
        stdin, stdout, stderr = client.exec_command('uname -a; df -h')
        print(f"{ip}: {stdout.read().decode()}")
    except Exception as e:
        print(f"Failed to connect {ip}: {str(e)}")
    finally:
        client.close()
该函数通过Paramiko建立SSH连接,执行系统命令获取内核信息与磁盘使用情况,适用于Linux环境的远程采集。
性能优化策略
  • 引入线程池控制并发数量,避免资源耗尽
  • 使用配置文件集中管理主机列表与认证信息
  • 增加结果日志输出,支持后续分析

4.2 配置文件模板化生成与分发机制

在现代基础设施管理中,配置文件的统一生成与高效分发是保障系统一致性的关键环节。通过模板引擎预定义配置结构,可实现环境差异化参数注入。
模板化生成流程
使用Go语言的text/template包进行配置渲染,支持变量占位符替换:
package main

import (
    "os"
    "text/template"
)

type Config struct {
    Host string
    Port int
}

func main() {
    tmpl := `server {
    listen {{.Port}};
    host {{.Host}};
}`
    t := template.Must(template.New("cfg").Parse(tmpl))
    config := Config{Host: "127.0.0.1", Port: 8080}
    t.Execute(os.Stdout, config)
}
上述代码定义了一个结构体Config,并通过template.Execute将字段值注入模板,动态生成目标配置。
分发策略
采用基于消息队列的异步推送机制,确保配置变更实时触达所有节点。支持灰度发布与版本回滚,提升系统稳定性。

4.3 用户账户批量创建与权限自动化设置

在大规模系统运维中,手动创建用户账户效率低下且易出错。通过脚本实现批量创建与权限分配,可显著提升管理效率。
自动化脚本示例
#!/bin/bash
# 批量创建用户并分配组权限
while read username department; do
  useradd -m -s /bin/bash "$username"
  mkdir /home/$username/.ssh
  usermod -aG $department "$username"
  echo "User $username created and added to group $department"
done < user_list.txt
该脚本从 user_list.txt 读取用户名和部门信息,自动调用 useradd 创建账户,并通过 usermod 将其加入对应系统组,实现权限的初步划分。
权限映射表
部门对应系统组默认权限
devdeveloperssudo, docker
opssysadminfull sudo
qatestersservice restart

4.4 定期备份脚本编写与异常通知集成

自动化备份是保障数据安全的核心环节。通过编写可调度的Shell脚本,能够实现数据库或文件系统的周期性备份。
基础备份脚本结构
#!/bin/bash
BACKUP_DIR="/data/backup"
DATE=$(date +%Y%m%d_%H%M)
TARGET="$BACKUP_DIR/backup_$DATE.tar.gz"

tar -czf $TARGET /var/www/html >/dev/null 2>&1
if [ $? -ne 0 ]; then
  echo "Backup failed at $DATE" | mail -s "Backup Alert" admin@example.com
fi
该脚本将网站目录打包压缩,输出至指定备份路径。若压缩命令执行失败(返回非零状态码),则触发邮件告警。
异常通知机制集成
  • 利用mail命令发送失败通知,确保运维人员及时响应
  • 结合cron定时任务,每日凌晨执行备份脚本
  • 通过重定向输出避免日志污染,仅在错误时激活通知

第五章:总结与源码获取说明

项目结构说明
  • cmd/:主程序入口,包含 main.go
  • internal/service/:业务逻辑处理模块
  • pkg/db/:数据库连接与操作封装
  • config.yaml:应用配置文件,支持环境变量覆盖
依赖管理与构建方式
使用 Go Modules 管理依赖,构建生产版本建议启用静态链接:
go mod tidy
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/app cmd/main.go
源码获取与分支策略
项目托管于 GitHub,采用标准 Git Flow 分支模型:
分支名称用途保护规则
main生产环境代码强制 PR + 双人审查
develop集成开发分支需通过 CI 测试
feature/*功能开发
部署验证示例
启动服务后可通过以下命令验证健康状态:
curl -s http://localhost:8080/health | jq '.status'
# 返回 "healthy" 表示运行正常

CI/CD 流程示意:

  1. 推送代码至 feature 分支触发单元测试
  2. 合并至 develop 后执行集成测试
  3. 发布 release 分支并打 tag
  4. 自动构建镜像并推送到私有 Registry
  5. Kubernetes 滚动更新部署
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值