2026年运维自动化实战:提升效率的Shell与Python脚本合集

进入2026年,随着混合云架构与边缘计算的深度普及,运维团队所面对的基础设施规模与复杂度呈指数级增长。传统的人工巡检与手动操作已无法满足现代IT对敏捷性与高可用性的要求。自动化不仅是提升效率的工具,更是2026年运维工程师的核心生存技能。本文将分享四个在2026年实战环境中经过检验的Shell与Python脚本,涵盖巡检、报警、补丁管理与云资源回收,帮助大家从繁琐的重复劳动中解放出来。

一、 批量服务器健康巡检脚本(Shell)

在多节点集群中,快速掌握整机健康状态是排查故障的第一步。以下Shell脚本通过SSH密钥免密登录,并行抓取目标主机的CPU负载、内存占用及磁盘使用率,并将结果汇总至本地日志。


#!/bin/bash
# 2026年多节点健康巡检脚本
HOSTS=("10.0.1.10" "10.0.1.11" "10.0.1.12") # 目标主机IP列表
LOG_FILE="/var/log/health_check_2026.log"
THRESHOLD=80 # 资源占用报警阈值(%)

echo "===== 2026年巡检开始: $(date '+%Y-%m-%d %H:%M:%S') =====" > $LOG_FILE

for HOST in ${HOSTS[@]}; do
    echo "正在巡检: $HOST" >> $LOG_FILE
    # 利用ssh远程执行命令,提取关键指标
    ssh -o ConnectTimeout=5 ops_user@$HOST "
        CPU_LOAD=\$(top -bn1 | grep 'Cpu(s)' | awk '{print \$2 + \$4}');
        MEM_USED=\$(free -m | awk '/Mem/{printf(\"%.1f\"), \$3/\$2*100}');
        DISK_USED=\$(df -h / | awk '/\/\$/ {print \$5}' | sed 's/%//g');
        
        echo \"CPU负载: \$CPU_LOAD% | 内存占用: \$MEM_USED% | 磁盘占用: \$DISK_USED%\";
        
        if [ \$DISK_USED -gt $THRESHOLD ]; then
            echo '⚠️ 警告: 根分区磁盘占用超过 $THRESHOLD%!'
        fi
    " >> $LOG_FILE 2>&1
done

echo "===== 巡检结束 =====" >> $LOG_FILE

实战建议:在2026年的生产环境中,建议结合Ansible的动态Inventory来替换静态的HOSTS数组,以适应云主机IP频繁变动的场景。

二、 智能日志分析与飞书/钉钉报警脚本(Python)

日志排查耗时费力,基于关键词匹配的报警往往存在误报。此Python脚本利用正则表达式与时间窗口过滤异常,并通过2026年主流协作平台的Webhook实现精准推送。


import re
import time
import requests
from datetime import datetime, timedelta

# 2026年日志监控与智能报警配置
LOG_PATH = "/var/log/app/service_2026.log"
WEBHOOK_URL = "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx" # 替换为实际Webhook
ERROR_PATTERN = re.compile(r'\[ERROR\]|Exception|OOM|ConnectionTimeout')
TIME_WINDOW = timedelta(minutes=10) # 仅报警10分钟内的最新错误

def parse_log_and_alert():
    alert_messages = []
    now = datetime.now()
    
    with open(LOG_PATH, 'r') as f:
        for line in f:
            # 提取日志时间戳 (假设格式为: 2026-03-15 10:00:00 ...)
            match_time = re.search(r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})', line)
            if match_time:
                log_time = datetime.strptime(match_time.group(1), '%Y-%m-%d %H:%M:%S')
                if (now - log_time) < TIME_WINDOW and ERROR_PATTERN.search(line):
                    alert_messages.append(line.strip())
    
    if alert_messages:
        payload = {
            "msg_type": "interactive",
            "card": {
                "header": {"title": {"tag": "plain_text", "content": "