阿里云已实名成品号 自动化运维脚本
你有没有过这种体验?凌晨两点,手机突然狂震——不是对象发来‘我们谈谈’,而是监控告警:数据库CPU飙到98%,主从延迟破万秒,日志里飘着一行幽幽的ERROR: too many connections。你一个鲤鱼打挺坐起,手指发抖敲开终端,手速堪比电竞选手:查进程、杀僵尸、重启服务、清缓存、改参数……等天边泛白,咖啡凉透,问题暂时压住,但心里清楚——这哪是救火,这是给定时炸弹拧螺丝。
别急着关页面。先放下那杯冷掉的美式,把键盘推远一点。今天咱不聊K8s调度策略,不扒Prometheus指标埋点,就聊一件最朴素、最带感、最能让你多睡两小时的事儿:自动化运维脚本。
对,就是那个被写在简历‘精通’栏、却常被当成‘会写hello world’的玩意儿。它不是高深莫测的黑科技,而是一把钝刀——不锋利,但够稳;不炫技,但管饱;不承诺永不出错,但坚决拒绝重复劳动。
一、别把脚本当神龛供着,它本质是‘数字懒人包’
很多人一听‘自动化’,脑补画面立刻切换成《终结者》T-800——金属骨架咔咔作响,双眼红光扫射,三秒内完成故障定位、根因分析、修复回滚、报告生成、全员邮件通报……醒醒!现实中的自动化运维脚本,大概率长得像你家楼下修空调的老张:穿着洗得发白的工装,兜里揣着万用表和一卷绝缘胶带,嘴上叼着半截烟,说话带点方言:“哎哟,又跳闸?我看看——哦,漏保老化了,换一个,十块钱,扫码。”
它不思考,只执行;不推理,只匹配;不创造,只搬运。它的核心使命就一条:把你从‘手动点鼠标→敲命令→复制粘贴→再敲一遍→怀疑自己敲错了→重来’这个死亡循环里,物理拽出来。
举个扎心例子:某次上线后要批量清理10台服务器上的临时日志,每台都要SSH登录、cd到目录、find + xargs删文件、确认磁盘空间、截图发群。耗时47分钟,出错2次(第3台误删了配置文件),最后靠备份恢复。而一个5行Shell脚本,加个for循环+ssh免密,跑完只要28秒,且结果自动汇总成表格。这差的不是技术,是尊严。
二、好脚本的三大铁律:能跑、能懂、能改
别信网上那些‘一行代码搞定全站巡检’的标题党。真·好脚本,必须经得起三问:
- 能跑吗? —— 不是‘在我机器上能跑’,是‘扔给新同事、换台干净系统、甚至丢进Docker容器里,照样滴溜转’。这意味着:路径写绝对不写相对(
/opt/app/logs≠./logs),依赖明确声明(#!/usr/bin/env python3而非#!/usr/bin/python),关键步骤加日志(哪怕只是echo "[INFO] Starting backup...")。 - 能懂吗? —— 三个月后你自己翻出来,不用翻Git历史、不用求同事、不靠玄学回忆,看注释就能秒懂‘这脚本在干啥、为啥这么干、改哪儿会炸’。注释不是写作文,是写说明书。比如:
# 注意:此处sleep 5是为避开NTP校时抖动导致的文件时间戳异常,非拍脑袋值 - 能改吗? —— 当业务从单机变集群、从MySQL换TiDB、从物理机迁云,脚本不能直接进回收站。它得有清晰的配置区(比如开头几行
BACKUP_DIR="/data/backup")、可开关的调试模式(DEBUG=true)、以及‘失败即终止’的保护机制(set -e或if [ $? -ne 0 ]; then exit 1; fi)。改起来像换灯泡,而不是拆发动机。
三、Shell vs Python:选工具,别选信仰
群里总有人吵:‘Shell太原始!Python才是未来!’ 拜托,这不是宗教辩论现场。选啥,看场景:
- Shell是‘厨房快炒’:适合轻量、短平快、强依赖系统命令的活儿。比如:检查磁盘空间、轮转日志、同步配置文件、批量启停服务。优势是‘开箱即用’(Linux自带),启动快(毫秒级),管道符
|用起来像呼吸一样自然。缺点?处理JSON、发HTTP请求、做复杂逻辑时,代码会迅速变成意大利面条。 - Python是‘智能电饭煲’:适合需要结构化、跨平台、带判断/循环/异常处理的活儿。比如:解析API返回的JSON数据做决策、连接数据库查状态、生成带图表的日报、调用云厂商SDK扩缩容。优势是生态强、可读性高、错误提示友好。缺点?启动慢(百毫秒级),还得操心环境(pip install?虚拟环境?)。
实战建议:别硬扛。混合用!Shell做‘入口门卫’(校验参数、检查权限、调起Python主程序),Python做‘大脑中枢’(逻辑处理、数据计算、外部交互)。就像老张修空调——先用万用表测电压(Shell),发现异常再掏出示波器分析波形(Python)。
四、一个真实脚本的诞生记:从‘手抖删库’到‘一键回滚’
去年我们有个需求:每周五晚自动备份核心数据库,并保留最近7天。最初是运维小王手动操作,某次手抖,把rm -rf /data/*写成了rm -rf /*……(此处省略三声救护车鸣笛)
阿里云已实名成品号 痛定思痛,我们写了这个脚本(精简版,已脱敏):
#!/bin/bash
# 数据库周备份脚本 v1.2
# 功能:mysqldump全库备份 + 压缩 + 清理旧备份 + 邮件通知
# 作者:运维部·防手抖委员会
# ===============【配置区】请按需修改 ===============
DB_USER="backup_user"
DB_PASS="xxx_secure_xxx"
DB_HOST="127.0.0.1"
DB_PORT="3306"
BACKUP_DIR="/backup/mysql_weekly"
RETENTION_DAYS=7
MYSQL_CMD="/usr/bin/mysqldump"
GZIP_CMD="/usr/bin/gzip"
MAIL_CMD="/usr/bin/mail"
ADMIN_EMAIL="[email protected]"
# ===============【安全校验】===============
if [[ ! -d "$BACKUP_DIR" ]]; then
echo "[ERROR] 备份目录不存在:$BACKUP_DIR"
exit 1
fi
if [[ ! -x "$MYSQL_CMD" ]]; then
echo "[ERROR] mysqldump未找到或无执行权限"
exit 1
fi
# ===============【核心逻辑】===============
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="production_db"
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_${DATE}.sql"
echo "[INFO] 开始备份数据库 $DB_NAME ..."
$MYSQL_CMD -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASS $DB_NAME > $BACKUP_FILE
if [[ $? -eq 0 ]]; then
echo "[INFO] SQL导出成功,开始压缩..."
$GZIP_CMD "$BACKUP_FILE"
COMPRESSED_FILE="${BACKUP_FILE}.gz"
# 计算MD5并记录
MD5=$(md5sum "$COMPRESSED_FILE" | awk '{print $1}')
echo "[INFO] 备份完成:$COMPRESSED_FILE (MD5: $MD5)"
# 清理旧备份
find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "[INFO] 已清理 $RETENTION_DAYS 天前的备份"
# 发送成功邮件
echo "备份成功!\n文件:$COMPRESSED_FILE\n大小:$(du -h $COMPRESSED_FILE | cut -f1)\nMD5:$MD5" | \
$MAIL_CMD -s "【SUCCESS】MySQL周备份完成" $ADMIN_EMAIL
else
echo "[ERROR] mysqldump执行失败!"
echo "备份失败,请立即人工介入!" | $MAIL_CMD -s "【ALERT】MySQL周备份失败" $ADMIN_EMAIL
exit 1
fi
看出来没?它没有炫技,但每一步都在防人类犯错:路径校验、命令存在性检查、失败退出、邮件双通道通知(成功/失败都报)、MD5校验、自动清理。后来我们还加了‘预演模式’(--dry-run参数),让脚本只打印要执行的命令,不真动手——这才是对生产环境最基本的尊重。
五、最后说句掏心窝子的话
自动化运维脚本,从来不是为了证明‘我会写代码’,而是为了践行一句朴素真理:工程师的价值,不在于能扛多少次夜班,而在于能让夜班越来越少。
它不会让你一夜暴富,但能帮你多陪孩子吃顿晚饭;它不能保证永不故障,但能把‘救火队员’升级成‘消防系统设计师’;它写的不是命令,是时间契约——把昨天重复3小时的劳动,兑换成今天多出的178分钟,用来喝杯热茶、理清思路、或者,单纯发会儿呆。
所以,别等‘哪天有空’再学。今晚下班前,打开终端,就写一行:#!/bin/bash\necho "Hello, my first auto-script!"。保存,chmod +x,执行。恭喜,你已踏入自动化世界的第一块砖——虽然它只输出了一行字,但从此,你和‘手动时代’之间,裂开了一道缝。
缝里透出来的光,叫自由。


