Shell脚本如何实现手动确认回滚策略

wen 实用脚本 25

本文目录导读:

Shell脚本如何实现手动确认回滚策略

  1. 基础确认模式
  2. 多级确认模式
  3. 带超时的自动确认
  4. 完整的回滚脚本示例
  5. 交互式回滚菜单
  6. 使用建议

我来介绍几种在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
}

使用建议

  1. 始终包含多重确认:特别是影响生产环境的操作
  2. 提供清晰的信息:显示当前状态、目标、影响范围
  3. 记录操作日志:便于审计和问题排查
  4. 支持取消操作:在每个步骤都应该允许用户取消
  5. 设置超时机制:避免脚本长时间等待用户输入
  6. 验证权限:确保有足够的权限执行操作

这些模式可以根据实际需求组合使用,为你的部署系统提供安全可靠的回滚机制。

抱歉,评论功能暂时关闭!