2026年运维自动化实战:高效Shell与Python脚本分享
2026年运维自动化实战:高效Shell与Python脚本分享
进入2026年,随着云原生架构与混合云规模的持续扩张,IT基础设施的复杂度达到了前所未有的高度。对于现代运维团队而言,纯手工操作已无法满足业务对高可用性与敏捷交付的需求。运维自动化不再是可选项,而是保障系统稳定运行的基石。本文将结合2026年主流的技术栈,分享三个在实际生产环境中经过检验的高效Shell与Python自动化脚本,帮助大家提升运维效率。
一、 Shell脚本:自动化日志归档与清理
在分布式系统中,节点日志的快速增长是导致磁盘空间耗尽的常见原因。2026年的微服务架构虽然普及了统一日志收集,但本地节点的临时日志和系统日志依然需要定期清理。以下脚本通过查找指定目录下超过特定天数的日志文件,进行gzip压缩并移动到归档目录,最后删除超期归档文件。
#!/bin/bash
# 2026年生产环境日志自动化归档与清理脚本
# 变量配置
LOG_DIR="/var/log/my_app"
ARCHIVE_DIR="/data/archives/logs"
DAYS_TO_COMPRESS=3
DAYS_TO_DELETE=30
# 确保归档目录存在
mkdir -p "$ARCHIVE_DIR"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始执行日志清理任务..."
# 查找并压缩超过 DAYS_TO_COMPRESS 天的日志文件
find "$LOG_DIR" -name "*.log" -type f -mtime +"$DAYS_TO_COMPRESS" | while read -r file; do
if [ ! -f "${file}.gz" ]; then
gzip "$file"
mv "${file}.gz" "$ARCHIVE_DIR/"
echo "已压缩并归档: $file"
fi
done
# 删除超过 DAYS_TO_DELETE 天的归档日志
find "$ARCHIVE_DIR" -name "*.gz" -type f -mtime +"$DAYS_TO_DELETE" -exec rm -f {} \;
echo "已删除超过 $DAYS_TO_DELETE 天的历史归档日志。"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 日志清理任务执行完毕。"
运维价值: 该脚本可配置在系统的定时任务中,有效防止因磁盘写满导致的服务宕机,同时保留了近期的压缩日志以供审计与故障排查使用。
二、 Python脚本:基于Asyncio的批量服务器健康巡检
2026年的运维场景中,面对成百上千台云主机或边缘计算节点,传统的串行SSH巡检效率极低。Python的asyncio结合asyncssh库能够实现高并发的异步巡检,大幅缩短全量巡检时间。以下脚本演示了如何异步获取多台服务器的CPU、内存及磁盘使用率。
import asyncio
import asyncssh
import json
# 2026年混合云节点清单
SERVERS = {
"node-01": "192.168.1.101",
"node-02": "192.168.1.102",
"node-03": "192.168.1.103",
}
SSH_USER = "ops_admin"
SSH_KEY_PATH = "/home/ops_admin/.ssh/id_ed25519"
async def check_host(hostname, ip):
try:
async with asyncssh.connect(ip, username=SSH_USER, client_keys=[SSH_KEY_PATH], known_hosts=None) as conn:
# 执行综合巡检命令
cmd = "echo '{\"cpu\":'$(top -bn1 | grep 'Cpu(s)' | awk '{print $2}')', \"mem\":'$(free | grep Mem | awk '{print $3/$2 * 100.0}')', \"disk\":'$(df -h / | awk 'NR==2{print $5}' | sed 's/%//')'}'"
result = await conn.run(cmd)
status = json.loads(result.stdout.strip())
status['hostname'] = hostname
status['ip'] = ip
return status
except Exception as e:
return {"hostname": hostname, "ip": ip, "error": str(e)}
async def main():
print("启动2026年Q1全网健康巡检...")
tasks = [check_host(name, ip) for name, ip in SERVERS.items()]
results = await asyncio.gather(*tasks)
for res in results:
if 'error' in res:
print(f"[CRITICAL] {res['hostname']} ({res['ip']}) 连接失败: {res['error']}")
else:
# 阈值告警判断
if res['disk'] > 85 or res['mem'] > 90:
print(f"[WARNING] {res['hostname']} 资源告急: CPU {res['cpu']}%, MEM {res['mem']:.2f}%, DISK {res['disk']}%")
else:
print(f"[OK] {res['hostname']} 运行正常: CPU {res['cpu']}%, MEM {res['mem']:.2f}%, DISK {res['disk']}%")
if __name__ == "__main__":
asyncio.run(main())
运维价值: 借助异步并发,原本串行需要数十分钟的巡检任务可缩短至几秒钟内完成。脚本可进一步与Webhook对接,将告警信息实时推送到企业通讯软件中。
三、 Shell脚本:Docker容器级数据卷自动备份
在2026年,容器化部署已成为应用交付的绝对主流。然而,许多团队在享受容器带来便利的同时,往往忽视了容器数据卷的灾备。以下脚本利用Docker命令行工具,实现容器内数据卷的自动化打包备份,并同步至对象存储。
#!/bin/bash
# 2026年容器数据卷安全备份脚本
CONTAINER_NAME="mysql-db-primary"
VOLUME_PATH="/var/lib/mysql"
BACKUP_DIR="/data/backups/containers"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/${CONTAINER_NAME}_${DATE}.tar.gz"
mkdir -p "$BACKUP_DIR"
echo "开始备份容器 $CONTAINER_NAME 的数据卷..."
# 使用docker run临时挂载容器卷并打包,避免直接操作运行中容器的文件系统
docker run --rm \
--volumes-from $CONTAINER_NAME \
-v $BACKUP_DIR:/backup \
alpine \
tar czf /backup/$(basename $BACKUP_FILE) $VOLUME_PATH
if [ $? -eq 0 ]; then
echo "本地备份成功: $BACKUP_FILE"
# 假设系统已配置 S3 兼容存储的 CLI 工具 (如 aws-cli 或 rclone)
rclone copy "$BACKUP_FILE" "s3-remote:prod-backups/containers/"
if [ $? -eq 0 ]; then
echo "云端同步成功。"
# 可选:清理本地超过7天的备份
find "$BACKUP_DIR" -name "${CONTAINER_NAME}_*.tar.gz" -mtime +7 -exec rm -f {} \;
else
echo "云端同步失败,请检查网络配置!"
fi
else
echo "备份失败,请检查容器状态!"
exit 1
fi
运维价值: 该脚本通过启动