运维自动化脚本分享:从“手动搬砖”到“自动建房”的进阶之路

在日常的运维工作中,我们经常需要面对成百上千台服务器,处理诸如系统巡检、日志清理、服务部署等重复性任务。如果完全依赖手动操作,不仅效率低下,而且极易因人为疏忽引发线上故障。正如行业内那句老话:“重复性的工作都应该被自动化”。

今天,我将分享几款在日常运维工作中极为实用的 Shell 与 Python 自动化脚本,希望能帮助大家从繁琐的“搬砖”工作中解放出来,将精力投入到更有价值的架构优化中。

Shell 脚本:轻量级系统管理的利器

Shell 脚本是运维人员最贴身的武器,其无需安装额外环境、直接调用系统命令的特性,使其成为处理系统级任务的首选。

1. 系统健康巡检脚本

定期的系统巡检是保障服务稳定的基础。以下脚本可以快速抓取 CPU、内存、磁盘及异常进程等关键指标,并设定阈值报警,适合通过 Cron 定时执行。


#!/bin/bash
# 系统健康巡检脚本

# 定义报警阈值
CPU_THRESHOLD=80
MEM_THRESHOLD=80
DISK_THRESHOLD=90

LOG_FILE="/var/log/system_health_$(date +%Y%m%d).log"

echo "===== 系统巡检开始: $(date) =====" | tee -a $LOG_FILE

# 1. 检查 CPU 占用率 (取 TOP 5 进程)
echo -e "\n[CPU 占用 TOP 5]" | tee -a $LOG_FILE
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -n 6 | tee -a $LOG_FILE

# 2. 检查内存使用率
MEM_USAGE=$(free | awk '/Mem/{printf("%.0f"), $3/$2*100}')
echo -e "\n[内存使用率] 当前: ${MEM_USAGE}% (阈值: ${MEM_THRESHOLD}%)" | tee -a $LOG_FILE
if [ "$MEM_USAGE" -gt "$MEM_THRESHOLD" ]; then
    echo "⚠️ 警告: 内存使用率超过阈值!" | tee -a $LOG_FILE
fi

# 3. 检查磁盘使用率
echo -e "\n[磁盘使用率]" | tee -a $LOG_FILE
df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $1 " " $6 }' | while read output;
do
  usage=$(echo $output | awk '{print $1}' | sed 's/%//g')
  partition=$(echo $output | awk '{print $3}')
  if [ "$usage" -ge "$DISK_THRESHOLD" ]; then
    echo "⚠️ 警告: 分区 $partition 使用率达到 ${usage}%!" | tee -a $LOG_FILE
  else
    echo "分区 $partition 使用率正常: ${usage}%" | tee -a $LOG_FILE
  fi
done

echo -e "\n===== 巡检结束 =====" | tee -a $LOG_FILE

2. 日志定时清理与轮转脚本

日志撑爆磁盘是运维常见的“血案”。此脚本用于查找并清理指定天数前的大体积日志文件,并保留最新的压缩包,释放磁盘空间。


#!/bin/bash
# 日志清理脚本
LOG_DIR="/var/log/app"
DAYS_TO_KEEP=7

echo "开始清理 $LOG_DIR 目录下超过 $DAYS_TO_KEEP 天的日志..."

# 查找并删除超过保留天数的 .log 文件
find $LOG_DIR -name "*.log" -type f -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
echo "已删除超过 $DAYS_TO_KEEP 天的 .log 文件"

# 查找并删除超过保留天数的 .gz 压缩包(假设之前做过轮转压缩)
find $LOG_DIR -name "*.gz" -type f -mtime +$DAYS_TO_KEEP -exec rm -f {} \;

# 将当前体积大于 100M 的活跃日志进行 gzip 压缩轮转
find $LOG_DIR -name "*.log" -type f -size +100M | while read logfile; do
    new_name="${logfile}.$(date +%Y%m%d%H%M%S).gz"
    gzip -c "$logfile" > "$new_name"
    cat /dev/null > "$logfile" # 清空原文件而非删除,避免进程丢失文件句柄
    echo "已轮转压缩: $logfile -> $new_name"
done

echo "清理完成!"

Python 脚本:复杂场景与跨平台的神器

当涉及到复杂的逻辑判断、API 交互或跨平台操作时,Python 的丰富库生态使其比 Shell 更具优势。

1. 批量端口存活检测脚本

在微服务架构下,服务节点众多。利用 Python 的 socket 模块,我们可以快速编写一个高并发的端口扫描器,检测服务是否存活。


#!/usr/bin/env python3
import socket
import concurrent.futures

def check_port(ip, port, timeout=2):
    """检测指定 IP:Port 是否连通"""
    try:
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.settimeout(timeout)
            result = s.connect_ex((ip, port))
            if result == 0:
                return (ip, port, True)
            else:
                return (ip, port, False)
    except Exception as e:
        return (ip, port, False)

def batch_scan(targets, max_workers=100):
    """并发扫描端口"""
    results = []
    with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
        futures = {executor.submit(check_port, ip, port): (ip, port) for ip, port in targets}
        for future in concurrent.futures.as_completed(futures):
            ip, port, is_open = future.result()
            status = "