2026年运维自动化实战:提升效率的Shell与Python脚本合集
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": "