运维脚本需工程化:命名规范(功能+环境+角色)、标准目录结构(bin/lib/conf/log/tests)、健壮性设计(set -euo pipefail、路径校验、参数验证)、结构化日志(带时间戳/级别/脱敏)、CI/CD集成(Git管理+Ansible分发)、最小权限与定期审计。
写运维脚本不是“能跑就行”,而是要可读、可维护、可复用、可审计。工程化不是给简单脚本套大词,是建立一套让团队协作顺畅、故障快速定位、变更安全可控的实践习惯。
脚本名不叫 a.sh 或 bak.sh,而应体现功能+环境+角色,例如:
backup_mysql_prod_daily.sh(生产环境每日 MySQL 备份)
check_disk_alert_staging.sh(预发环境磁盘告警检查)
标准目录结构建议(以项目为单位):
真实运维场景中,失败往往发生在边界条件:磁盘满、权限不足、服务未启动、命令不存在、网络超时。脚本必须主动防御:
set -euo pipefail(遇错中断、未定义变量报错、管道任一环节失败即退出)[[ $? -eq 0 ]] || { echo "备份失败" >&2; exit 1; }
cd /path && [[ $? -eq 0 ]] || die "进入目录失败",不假设当前工作目录/usr/bin/find 而非 find),避免 PATH 污染导致行为异常不要只靠 echo,要结构化记录:
&2,正常输出走 &1,方便管道和重定向分离log_info "开始压缩 /var/log/nginx/"; tar -czf ...; log_info "压缩完成,大小 $(du -h archive.tgz | awk '{print $1}')"
logrotate 或脚本内 find log/ -name "*.log" -mtime +7 -delete)运维脚本上线 ≠ scp 到服务器 chmod +x:
main 对应生产,dev 用于测试,提交需 PR + 至少一人 review)ops)运行,该用户仅拥有必要 sudo 权限(如 sudoers
中限定为 NOPASSWD: /usr/local/bin/backup_*.sh)git log -p --since="30 days ago" -- bin/ lib/ 快速回溯风险操作./script.sh -h 输出用法、参数说明、示例,降低新成员上手成本