本文目录导读:

我来介绍几种在Shell脚本中实现手动确认回滚策略的方法:
基础确认模式
#!/bin/bash
# 回滚确认函数
confirm_rollback() {
echo "警告:即将执行回滚操作!"
echo "操作时间:$(date)"
echo "当前环境:$(hostname)"
echo "备份文件:$1"
read -p "确认要执行回滚吗?(yes/no): " confirmation
case "$confirmation" in
yes|YES|y|Y)
return 0
;;
*)
echo "回滚操作已取消"
return 1
;;
esac
}
# 使用示例
if confirm_rollback "/backup/app_20240101.tar.gz"; then
echo "开始执行回滚..."
# 执行回滚命令
else
echo "回滚流程终止"
exit 1
fi
多级确认模式
#!/bin/bash
confirm_rollback_advanced() {
local backup_path="$1"
local target_app="$2"
echo "========================================"
echo " 回滚操作确认"
echo "========================================"
echo "回滚目标: $target_app"
echo "备份文件: $backup_path"
echo "========================================"
# 第一级确认:基本信息确认
read -p "以上信息是否正确?(yes/no): " first_confirm
[[ "$first_confirm" != "yes" ]] && { echo "操作取消"; return 1; }
# 第二级确认:检查当前状态
echo "当前应用状态:"
systemctl status "$target_app" 2>/dev/null | head -n 3 || echo "服务未运行"
read -p "确认要在此状态下执行回滚?(yes/no): " second_confirm
[[ "$second_confirm" != "yes" ]] && { echo "操作取消"; return 1; }
# 第三级确认:最终确认
echo ""
echo "!!!!!! 最终警告 !!!!!!"
echo "此操作将覆盖当前版本的应用文件"
echo "请在输入框中输入 'ROLLBACK' 确认执行:"
read -p "> " final_confirm
if [[ "$final_confirm" == "ROLLBACK" ]]; then
echo "开始执行回滚..."
return 0
else
echo "操作已取消"
return 1
fi
}
带超时的自动确认
#!/bin/bash
confirm_with_timeout() {
local timeout=${1:-30} # 默认30秒超时
local message=${2:-"确认执行回滚?"}
echo "$message"
echo "超时时间:${timeout}秒(超时将自动取消)"
if read -t "$timeout" -p "输入 yes 确认: " response; then
case "$response" in
yes|YES|y|Y)
return 0
;;
*)
echo "操作取消"
return 1
;;
esac
else
echo ""
echo "操作超时,自动取消"
return 1
fi
}
完整的回滚脚本示例
#!/bin/bash
# 颜色编码
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 配置
BACKUP_DIR="/backups"
APP_DIR="/var/www/app"
BACKUP_FILE=""
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/var/log/rollback_${TIMESTAMP}.log"
# 日志函数
log() {
echo -e "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 列出可用备份
list_backups() {
echo -e "${YELLOW}可用备份列表:${NC}"
ls -1 "$BACKUP_DIR"/*.tar.gz 2>/dev/null || echo "未找到备份文件"
}
# 回滚确认函数
rollback_confirmation() {
clear
echo -e "${RED}=======================================${NC}"
echo -e "${RED} 回滚操作确认 (5步确认流程)${NC}"
echo -e "${RED}=======================================${NC}"
# 步骤1:环境确认
echo -e "\n${YELLOW}[步骤1/5] 环境确认${NC}"
echo "主机名: $(hostname)"
echo "当前用户: $(whoami)"
read -p "是否在正确的机器上执行?(yes/no): " env_confirm
[[ "$env_confirm" != "yes" ]] && return 1
# 步骤2:备份确认
echo -e "\n${YELLOW}[步骤2/5] 备份确认${NC}"
echo "将要使用的备份: $BACKUP_FILE"
echo "备份大小: $(du -h "$BACKUP_FILE")"
read -p "确认使用此备份?(yes/no): " backup_confirm
[[ "$backup_confirm" != "yes" ]] && return 1
# 步骤3:目标确认
echo -e "\n${YELLOW}[步骤3/5] 目标确认${NC}"
echo "目标目录: $APP_DIR"
echo "目录内容:"
ls -la "$APP_DIR" | head -5
read -p "确认目标目录正确?(yes/no): " target_confirm
[[ "$target_confirm" != "yes" ]] && return 1
# 步骤4:服务确认
echo -e "\n${YELLOW}[步骤4/5] 服务状态确认${NC}"
if systemctl is-active --quiet nginx 2>/dev/null; then
echo "Nginx 服务状态: 运行中 (将会重启)"
else
echo "Nginx 服务状态: 未运行 (将会启动)"
fi
read -p "是否继续?(yes/no): " service_confirm
[[ "$service_confirm" != "yes" ]] && return 1
# 步骤5:最终确认
echo -e "\n${RED}[步骤5/5] 最终确认${NC}"
echo -e "${RED}危险操作!这将覆盖当前应用文件${NC}"
echo "请输入 'ROLLBACK_NOW' 以确认执行:"
read final_confirm
if [[ "$final_confirm" != "ROLLBACK_NOW" ]]; then
echo -e "${YELLOW}操作已取消${NC}"
return 1
fi
return 0
}
# 执行回滚
execute_rollback() {
log "${GREEN}开始执行回滚...${NC}"
# 备份当前版本
log "备份当前版本..."
cp -r "$APP_DIR" "${APP_DIR}_backup_${TIMESTAMP}"
# 停止服务
log "停止服务..."
systemctl stop nginx 2>/dev/null
# 恢复备份
log "恢复备份..."
rm -rf "$APP_DIR"/*
tar -xzf "$BACKUP_FILE" -C "$APP_DIR"
# 启动服务
log "启动服务..."
systemctl start nginx 2>/dev/null
# 验证
log "验证回滚结果..."
if systemctl is-active --quiet nginx; then
echo -e "${GREEN}回滚成功完成!${NC}"
else
echo -e "${RED}回滚可能失败,请检查服务状态${NC}"
fi
log "回滚操作日志已保存至: $LOG_FILE"
}
# 主函数
main() {
# 检查root权限
if [[ $EUID -ne 0 ]]; then
echo -e "${RED}此脚本需要root权限运行${NC}"
exit 1
fi
# 列出可用备份
list_backups
# 选择备份
read -p "请输入备份文件名: " BACKUP_FILE
BACKUP_FILE="$BACKUP_DIR/$BACKUP_FILE"
if [[ ! -f "$BACKUP_FILE" ]]; then
echo -e "${RED}备份文件不存在: $BACKUP_FILE${NC}"
exit 1
fi
# 执行确认流程
if rollback_confirmation; then
execute_rollback
else
echo -e "${YELLOW}回滚操作已取消${NC}"
exit 1
fi
}
# 运行主函数
main
交互式回滚菜单
#!/bin/bash
interactive_rollback_menu() {
while true; do
clear
echo "========================================"
echo " 回滚管理菜单"
echo "========================================"
echo "1. 查看可用备份"
echo "2. 执行快速回滚"
echo "3. 执行安全回滚(5步确认)"
echo "4. 查看回滚历史"
echo "5. 退出"
echo "========================================"
read -p "请选择操作 [1-5]: " choice
case $choice in
1)
echo "可用备份列表:"
ls -lh /backups/*.tar.gz 2>/dev/null
read -p "按回车键继续..."
;;
2)
echo "执行快速回滚..."
if confirm_rollback; then
execute_rollback
fi
;;
3)
echo "执行安全回滚..."
if rollback_confirmation; then
execute_rollback
fi
;;
4)
echo "回滚历史记录:"
cat /var/log/rollback.log 2>/dev/null || echo "无历史记录"
read -p "按回车键继续..."
;;
5)
echo "退出回滚管理"
exit 0
;;
*)
echo "无效选择"
sleep 2
;;
esac
done
}
使用建议
- 始终包含多重确认:特别是影响生产环境的操作
- 提供清晰的信息:显示当前状态、目标、影响范围
- 记录操作日志:便于审计和问题排查
- 支持取消操作:在每个步骤都应该允许用户取消
- 设置超时机制:避免脚本长时间等待用户输入
- 验证权限:确保有足够的权限执行操作
这些模式可以根据实际需求组合使用,为你的部署系统提供安全可靠的回滚机制。