8 年运维经验总结:20 个自动化脚本实战分享
本文分享的 20 个运维脚本,涵盖监控、备份、部署、安全、工具五大场景,每个脚本都经过生产环境验证。
前言
运维工作有个特点:重复性操作特别多。
每天都要检查磁盘空间,每周都要清理日志,每月都要更新证书,每次部署都要备份配置。
刚开始我觉得手动操作也挺快,但后来发现,同样的操作重复 3 次以上,就值得写个脚本自动化。
这篇文章分享的 20 个脚本,是我 8 年运维工作中积累下来的,每个都经过生产环境验证。今天分享出来,希望能帮到同行。
脚本清单
监控告警类 5 个:disk_monitor.sh、system_monitor.sh、service_health_check.sh、ssl_cert_monitor.py、process_monitor.sh
备份恢复类 4 个:mysql_backup.sh、redis_backup.sh、website_backup.sh、log_rotate.sh
部署发布类 3 个:nginx_deploy.sh、git_deploy.sh、cert_renew.sh
安全加固类 4 个:ssh_login_monitor.sh、port_scan_check.py、firewall_setup.sh、password_generator.py
工具类 4 个:sysinfo.sh、docker_clean.sh、nginx_log_analyzer.py、db_health_check.py
核心脚本详解
磁盘空间监控
使用场景:防止磁盘写满导致服务不可用
这个脚本我几乎每台服务器都在用。核心逻辑很简单,遍历所有分区,检查使用率,超过阈值就发告警。
#!/bin/bash
THRESHOLD=${1:-80}
df -h | grep -E '^/dev/' | while read line; do
use_percent=$(echo "$line" | awk '{print $5}' | tr -d '%')
mounted=$(echo "$line" | awk '{print $6}')
if [ "$use_percent" -ge "$THRESHOLD" ]; then
curl -s -X POST "$ALERT_WEBHOOK" \
-H "Content-Type: application/json" \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"磁盘告警!分区:$mounted 使用率:${use_percent}%\"}}"
fi
done
配置 crontab,每小时检查一次:
0 * * * * /path/to/disk_monitor.sh 80 >> /var/log/disk_monitor.log 2>&1
实战案例:某次凌晨 3 点磁盘告警,起来一看是日志文件暴涨,及时处理避免了一次事故。
MySQL 自动备份
使用场景:数据库自动备份,支持远程上传
备份的重要性不用多说。这个脚本支持全库备份、指定库备份,备份完自动压缩,还可以上传到另一台服务器。
#!/bin/bash
DB_HOST="localhost"
DB_USER="root"
BACKUP_DIR="/data/backups/mysql"
RETENTION_DAYS=7
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="mysql_backup_${DATE}.sql.gz"
mysqldump -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASSWORD" \
--all-databases --single-transaction --quick \
| gzip > "${BACKUP_DIR}/${BACKUP_FILE}"
find "$BACKUP_DIR" -name "mysql_backup_*.sql.gz" -mtime +$RETENTION_DAYS -delete
每天凌晨 2 点备份:
0 2 * * * /path/to/mysql_backup.sh
最佳实践:备份文件上传到远程服务器,定期进行恢复演练,加密敏感数据。
服务健康检查
使用场景:自动检测服务状态,异常时自动重启
这个是真的救命脚本。有次 mysql 半夜挂了,脚本自动重启,等我早上看到告警的时候服务已经恢复了。
#!/bin/bash
SERVICES=("nginx" "mysql" "redis")
MAX_RESTART=3
for service in "${SERVICES[@]}"; do
if ! systemctl is-active --quiet "$service"; then
systemctl restart "$service"
# 发送告警
fi
done
Nginx 配置部署
使用场景:安全部署 Nginx 配置,支持自动回滚
这个脚本救过我很多次。有次手误写了个错误配置,脚本测试失败自动回滚,避免了线上事故。
#!/bin/bash
NEW_CONF="$1"
BACKUP_DIR="/data/backups/nginx"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
cp /etc/nginx/nginx.conf "$BACKUP_DIR/nginx.conf.$TIMESTAMP.bak"
cp "$NEW_CONF" /etc/nginx/nginx.conf
if nginx -t; then
nginx -s reload
else
cp "$BACKUP_DIR/nginx.conf.$TIMESTAMP.bak" /etc/nginx/nginx.conf
echo "配置测试失败,已回滚"
exit 1
fi
SSL 证书监控
使用场景:监控多个域名的 SSL 证书有效期
证书过期这种事听起来很低级,但真的会发生。这个脚本检查所有域名的证书,提前一个月告警。
#!/usr/bin/env python3
import ssl
import socket
import datetime
def check_ssl_cert(host, port=443):
context = ssl.create_default_context()
with socket.create_connection((host, port), timeout=10) as sock:
with context.wrap_socket(sock, server_hostname=host) as ssock:
cert = ssock.getpeercert()
not_after = datetime.datetime.strptime(cert["notAfter"], "%b %d %H:%M:%S %Y %Z")
days_remaining = (not_after - datetime.datetime.utcnow()).days
return days_remaining
domains = ["www.example.com", "api.example.com"]
for domain in domains:
days = check_ssl_cert(domain)
if days <= 30:
print(f"{domain} 证书将在 {days} 天后过期")
系统信息收集
使用场景:故障排查时快速收集系统信息
这个是我用得最多的脚本之一。每次出问题,先跑一下这个,所有信息都收集好了,排查起来快很多。
#!/bin/bash
{
echo "【系统版本】"
cat /etc/os-release
uname -a
echo "【CPU 信息】"
lscpu | grep -E "^(Architecture|CPU\(s\)|Model name)"
echo "【内存信息】"
free -h
echo "【磁盘使用】"
df -h
echo "【网络连接】"
ss -tlnp
echo "【运行进程 TOP10】"
ps aux --sort=-%mem | head -11
} > /tmp/sysinfo_$(hostname).txt
Docker 清理
使用场景:定期清理未使用的 Docker 资源
Docker 用久了磁盘空间不知不觉就满了,这个脚本一键清理,我一般每周跑一次。
#!/bin/bash
docker container prune -f
docker image prune -f
docker volume prune -f
docker network prune -f
告警集成
大部分脚本支持钉钉/企业微信告警,设置个环境变量就行:
export ALERT_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
./disk_monitor.sh 80
钉钉 Webhook 配置:进入钉钉群 → 群设置 → 智能助手 → 添加机器人,选择"自定义"机器人,复制 Webhook 地址,安全设置选择"自定义关键词",填入"告警"。
安全建议
密码不要硬编码在脚本里,要从环境变量读取:
# 错误做法
DB_PASSWORD="my_password"
# 正确做法
DB_PASSWORD="${DB_PASSWORD:-}"
脚本权限设置:
chmod +x script.sh
chmod 700 script.sh # 只有所有者可执行
获取方式
项目已在 GitHub 分享:
git https://gitee.com/zmleasy/ops-scripts.git
cd ops-scripts
chmod +x *.sh *.py
后续计划
增加 K8s 相关脚本(Pod 监控、Deployment 检查等),添加 Prometheus Exporter,编写单元测试,制作 Docker 镜像,完善文档。
如果觉得有用,记得给个 Star。
作者:8 年运维经验,专注于运维自动化和云原生技术
其他项目:SMS 告警管理系统:gitee.com/zmleasy/sms…