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

运维价值: 该脚本通过启动