#!/bin/bash # 主自動修復協調腳本 (UAT + GCP 雙環境) # 功能:協調所有自動修復腳本,確保 UAT 和 GCP 系統穩定性 # 執行位置:UAT 主機 (192.168.0.110) SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" LOG_FILE="/var/log/master_auto_repair.log" LOCK_FILE="/tmp/master_auto_repair.lock" # 確保 gcloud 在 PATH 中 (Cron 不讀取 .bashrc) export PATH="$PATH:/home/wooo/google-cloud-sdk/bin" export KUBECONFIG="/home/wooo/.kube/config" # 環境標記 ENV_UAT="🟦 UAT" ENV_GCP="🟥 GCP" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] [Master] $1" | tee -a "$LOG_FILE" } # 防止重複執行 acquire_lock() { exec 200>"$LOCK_FILE" if ! flock -n 200; then log "另一個實例正在運行,退出" exit 0 fi } # 執行子腳本 run_script() { local name=$1 local script=$2 local timeout=${3:-300} # 預設超時 5 分鐘 if [ -x "$script" ]; then log "執行: $name" timeout "$timeout" bash "$script" 2>&1 | while read line; do log "[$name] $line" done local exit_code=$? if [ $exit_code -eq 124 ]; then log "警告: $name 執行超時" fi else log "警告: $script 不存在或不可執行" fi } # 檢查 gcloud 是否可用 (GCP 腳本需要) check_gcloud() { if command -v gcloud &> /dev/null; then return 0 else log "警告: gcloud 未安裝,跳過 GCP 腳本" return 1 fi } main() { acquire_lock log "=========================================" log "開始主自動修復流程 (UAT + GCP 雙環境)" log "=========================================" local current_minute=$(date +%M) # ============================================ # UAT 環境修復 # ============================================ log "--- $ENV_UAT 環境檢查 ---" # 1. UAT OOM 處理 (每 15 分鐘) if [ $((current_minute % 15)) -eq 0 ]; then run_script "UAT OOM Handler" "$SCRIPT_DIR/oom-handler.sh" 120 fi # 2. UAT PostgreSQL 維護 (每 30 分鐘) if [ $((current_minute % 30)) -eq 0 ]; then run_script "UAT PostgreSQL Repair" "$SCRIPT_DIR/postgres-repair.sh" 180 fi # 3. UAT 自動回滾檢測 (每 5 分鐘) run_script "UAT Auto Rollback" "$SCRIPT_DIR/auto-rollback.sh" 120 # ============================================ # GCP 環境修復 (透過 gcloud SSH) # ============================================ if check_gcloud; then log "--- $ENV_GCP 環境檢查 ---" # 4. GCP OOM 處理 (每 15 分鐘) if [ $((current_minute % 15)) -eq 0 ]; then run_script "GCP OOM Handler" "$SCRIPT_DIR/oom-handler-gcp.sh" 180 fi # 5. GCP PostgreSQL 維護 (每 30 分鐘) if [ $((current_minute % 30)) -eq 0 ]; then run_script "GCP PostgreSQL Repair" "$SCRIPT_DIR/postgres-repair-gcp.sh" 240 fi # 6. GCP 自動回滾檢測 (每 5 分鐘) run_script "GCP Auto Rollback" "$SCRIPT_DIR/auto-rollback-gcp.sh" 180 fi log "=========================================" log "主自動修復流程完成 (UAT + GCP)" log "=========================================" } main "$@"