2026年5月运维实战:高效Shell与Python自动化脚本分享

随着2026年企业IT架构全面向云原生与混合云演进,运维团队面临的系统复杂度与日均任务量呈指数级上升。在这个时代,依靠纯手工敲命令的“人肉运维”早已被淘汰,标准化、可复用的自动化脚本成为每位运维工程师的必备武器。本文将结合2026年的主流运维场景,分享三款经过生产环境检验的Shell与Python自动化脚本,助力大家提升运维效率,告别重复劳动。

场景一:批量服务器健康巡检与日志清理(Shell)

在2026年的多云环境下,我们依然需要管理大量的传统Linux主机。磁盘爆满和内存溢出是最常见的线上故障。以下Shell脚本通过SSH密钥认证,批量并行巡检目标主机的磁盘与内存状态,并在磁盘使用率超过阈值时,自动清理超过7天的旧日志。


#!/bin/bash
# 2026年批量巡检与日志清理脚本
# 依赖:sshpass或配置免密登录,并行工具parallel(可选)

SERVER_LIST="/ops/config/servers_2026.txt"
THRESHOLD_DISK=80
THRESHOLD_MEM=90
LOG_DIR="/var/log/app"
DAYS_TO_KEEP=7

while read -r ip user; do
    echo "=== 正在巡检 $ip ==="
    
    # 远程获取磁盘和内存使用率
    disk_usage=$(ssh "$user@$ip" "df -h / | awk 'NR==2{print \$5}' | sed 's/%//g'")
    mem_usage=$(ssh "$user@$ip" "free | awk '/Mem/{printf(\"%.0f\"), \$3/\$2*100}'")
    
    echo "$ip 磁盘使用率: ${disk_usage}% | 内存使用率: ${mem_usage}%"
    
    # 判断磁盘是否超限并执行清理
    if [ "$disk_usage" -gt "$THRESHOLD_DISK" ]; then
        echo "[WARN] $ip 磁盘超过 ${THRESHOLD_DISK}%,启动日志清理..."
        ssh "$user@$ip" "find $LOG_DIR -type f -name '*.log' -mtime +$DAYS_TO_KEEP -exec rm -f {} \;"
        echo "$ip 日志清理完成。"
    fi
    
    # 判断内存是否超限(可接入企业微信/钉钉告警API)
    if [ "$mem_usage" -gt "$THRESHOLD_MEM" ]; then
        echo "[CRITICAL] $ip 内存超过 ${THRESHOLD_MEM}%,请立即排查!"
        # 此处可加入2026年常用的Webhook告警推送逻辑
    fi
    
done < "$SERVER_LIST"

脚本解析: 该脚本通过文本文件读取主机列表,动态抓取关键指标。清理逻辑使用了find -mtime,精准删除过期日志,避免误删活跃文件。在生产使用前,建议先去掉rm -f并替换为ls进行预览确认。

场景二:SSL证书过期自动预警(Python)

2026年,HTTPS已成为所有对外服务的强制标准。证书过期导致的业务中断是低级却致命的失误。面对成百上千个域名,人工核对有效期已不现实。以下Python脚本利用标准库定时扫描域名证书,并在到期前30天通过企业IM推送告警。


#!/usr/bin/env python3
# 2026年SSL证书有效期巡检与告警脚本

import ssl
import socket
from datetime import datetime, timedelta
import urllib.request
import json

DOMAIN_LIST = ["api.company.com", "portal.company.com", "cdn.company.com"]
WARN_DAYS = 30
WEBHOOK_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_2026_KEY"

def check_ssl_expiry(domain):
    context = ssl.create_default_context()
    conn = context.wrap_socket(socket.socket(), server_hostname=domain)
    conn.settimeout(5.0)
    conn.connect((domain, 443))
    cert = conn.getpeercert()
    expire_date_str = cert['notAfter']
    # 解析证书时间格式 (如: 'May 10 12:00:00 2026 GMT')
    expire_date = datetime.strptime(expire_date_str, "%b %d %H:%M:%S %Y %Z")
    conn.close()
    return expire_date

def send_alert(domain, days_left):
    msg = f"⚠️【SSL证书预警】域名 {domain} 的SSL证书将在 {days_left} 天后过期(到期日:2026年内),请尽快安排续签!"
    data = {"msgtype": "text", "text": {"content": msg}}
    req = urllib.request.Request(WEBHOOK_URL, data=json.dumps(data).encode('utf-8'), headers={'Content-Type': 'application/json'})
    urllib.request.urlopen(req)

if __name__ == "__main__":
    for domain in DOMAIN_LIST:
        try:
            expire_date = check_ssl_expiry(domain)
            days_left = (expire_date - datetime.now()).days
            print(f"域名: {domain} | 剩余天数: {days_left}")
            if days_left <= WARN_DAYS:
                send_alert(domain, days_left)
        except Exception as e:
            print(f"检查 {domain} 失败: {e}")

脚本解析: 脚本无需安装第三方依赖,纯靠Python内置的sslsocket模块提取证书notAfter字段。当剩余天数小于30天时,触发Webhook推送。运维人员可将其加入2026年的Kubernetes CronJob或系统Crontab中,实现每日无人值守巡检。

场景三:Docker容器日志膨胀自动截断(Shell)

2026年的云原生架构中,Docker依然是重要的容器运行时。容器内部应用不断向stdout输出日志,若未配置合理的日志驱动(如json-file限制大小),极易导致宿主机磁盘被单个容器的日志文件撑爆。


#!/bin/bash
# 2026年Docker宿主机容器日志截断脚本

LOG_MAX_SIZE="500M" # 每个容器日志文件最大保留500MB

echo "=== 开始扫描Docker容器日志 ==="
for container_id in $(docker ps -q); do
    # 获取容器日志路径
    log_path=$(docker inspect --format='{{.LogPath}}' "$container_id")
    
    if [ -z "$log_path" ]; then
        continue
    fi
    
    current_size=$(du -b "$log_path" | awk '{print $1}')
    max_bytes=$(echo "$LOG_MAX_SIZE" | sed 's/M//g' | awk '{print $1 * 1024 * 1024}')
    
    if [ "$current_size" -gt "$max_bytes" ]; then
        container_name=$(docker inspect --format='{{.Name}}' "$container_id" | sed 's/\///')
        echo "[处理] 容器 $container_name 日志超限 (${current_size} bytes),执行截断..."
        # 使用truncate清空文件但保留文件句柄,避免容器进程崩溃
        truncate -s 0 "$log_path"
        echo "$container_name 日志已截断。"
    fi
done
echo "=== 截断扫描完成 ==="

脚本解析: 这是一个典型的“兜底”脚本。核心亮点在于使用了truncate -s 0而非rm。直接删除日志文件会导致Docker守护进程丢失文件句柄,容器新日志将无法写入甚至引发进程异常;而truncate则能安全清空内容并保留句柄,这是2026年高级运维必须掌握的细节。

2026年运维脚本编写与执行的安全准则

在分享脚本的同时,必须强调2026年运维自动化的安全红线:

  1. 幂等性优先:所有自动化脚本必须支持重复执行而不产生副作用。例如清理脚本,多次运行结果应一致,不能第一天清理正常,第二天把配置文件误删。
  2. 告别明文密码:2026年零信任架构普及,脚本中严禁硬编码任何密码或Token。必须通过环境变量、Vault密钥管理系统或云实例的IAM Role动态获取凭证。
  3. 操作留痕与回滚:任何涉及变更的脚本(如清理、重启、更新)必须先输出变更清单,执行前生成快照或备份,并在脚本末尾将执行结果写入集中式日志中心(如ELK/Loki)。

自动化脚本不是一劳永逸的银弹,而是运维智慧的沉淀。希望以上三款脚本能为你的2026年运维工作带来启发,让你从繁杂的琐事中解放出来,投入到更有价值的架构优化与SRE体系建设中。