第一章:运维自动化脚本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、内存、网络等指标采集 |
| paramiko | SSH远程操作 | 实现安全的远程命令执行与文件传输 |
| 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
该脚本通过
top、
free和
df获取实时资源使用率,设定阈值触发告警。
定时任务配置
使用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秒轮询一次健康接口,异常连续三次则触发告警。
自动恢复策略
当检测到服务不可用时,执行预定义恢复流程:
- 重启应用容器
- 切换流量至备用实例
- 发送告警通知运维人员
结合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 将其加入对应系统组,实现权限的初步划分。
权限映射表
| 部门 | 对应系统组 | 默认权限 |
|---|
| dev | developers | sudo, docker |
| ops | sysadmin | full sudo |
| qa | testers | service 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.gointernal/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 流程示意:
- 推送代码至 feature 分支触发单元测试
- 合并至 develop 后执行集成测试
- 发布 release 分支并打 tag
- 自动构建镜像并推送到私有 Registry
- Kubernetes 滚动更新部署