Files
ROMFASTSQL/proxmox/cluster/failover/arhiva/failover-vm201.sh
Claude Agent 0104c255a5 feat(cluster): cluster-shutdown/startup --allow-on-node pentru rulare pe pvemini
Rulare detasata din dashboard/Discord: nssh local fara ssh la sine, CT 171
ramane pornit si moare odata cu pvemini (HA freeze il reporneste), email cu
instructiunile de pornire, pauza si pentru testul DR si fereastra de patch.
Garda CT 171 nu mai depinde de /proc/1/environ (era sarita fara root).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KddsXCqEbKMhdFJDYbAsx8
2026-09-13 10:18:12 +00:00

80 lines
2.6 KiB
Bash
Executable File

#!/bin/bash
# Manual failover VM 201 (roacentral Windows) către pveelite
# Deployed la /opt/scripts/failover-vm201.sh pe pveelite
# Folosește ultima replicare ZFS locală
set -euo pipefail
VMID=201
PRIMARY=pvemini
PRIMARY_IP=10.0.20.201
SECONDARY=$(hostname)
LOG=/var/log/failover-vm201.log
MAIL_TO=mmarius28@gmail.com
log() { echo "[$(date '+%F %T')] $*" | tee -a "$LOG"; }
die() { log "ABORT: $*"; exit 1; }
[[ "$SECONDARY" == "pveelite" ]] || die "Rulează pe pveelite, nu pe $SECONDARY"
[[ $EUID -eq 0 ]] || die "Trebuie root"
FORCE=${1:-}
log "=== Failover VM $VMID pornit ==="
# Check 1: pvemini efectiv down
log "Verific $PRIMARY..."
if ping -c 2 -W 2 "$PRIMARY_IP" &>/dev/null; then
if ssh -o ConnectTimeout=5 -o BatchMode=yes "root@$PRIMARY_IP" 'pvecm status' &>/dev/null; then
die "$PRIMARY răspunde la ping + ssh. NU fac failover. Oprește manual VM 201 pe $PRIMARY înainte."
fi
log "$PRIMARY ping OK dar ssh fail — posibil degradat"
fi
log "$PRIMARY confirmat DOWN"
# Check 2: VM nu rulează deja local
if qm status "$VMID" 2>/dev/null | grep -q running; then
die "VM $VMID deja running pe $SECONDARY"
fi
# Check 3: discul există local (ultima replicare)
if ! zfs list "rpool/data/vm-$VMID-disk-3" &>/dev/null; then
die "Disc vm-$VMID-disk-3 lipsește local. Replicare nefuncțională?"
fi
LAST_SNAP=$(zfs list -t snapshot -o name,creation -s creation "rpool/data/vm-$VMID-disk-3" 2>/dev/null | tail -1)
log "Ultima replicare: $LAST_SNAP"
# Confirmare interactivă
if [[ "$FORCE" != "--yes" ]]; then
echo
echo "========================================"
echo "ATENȚIE: VM $VMID va porni pe $SECONDARY"
echo "folosind ultima replicare ZFS."
echo "Date pierdute = ce s-a scris după $LAST_SNAP"
echo "========================================"
read -p "Continui? (tastează 'DA' pentru confirmare): " CONFIRM
[[ "$CONFIRM" == "DA" ]] || die "Anulat de utilizator"
fi
# Start
log "Pornesc VM $VMID pe $SECONDARY..."
qm start "$VMID"
sleep 5
STATUS=$(qm status "$VMID" | awk '{print $2}')
log "Status: $STATUS"
# Mail
{
echo "Failover VM $VMID executat pe $SECONDARY la $(date)"
echo
echo "Primary $PRIMARY era DOWN."
echo "Ultima replicare folosită: $LAST_SNAP"
echo "Status VM: $STATUS"
echo
echo "Pași următori:"
echo "1. Verifică aplicația Windows pe 10.0.20.201 (IIS, etc)"
echo "2. Când $PRIMARY revine, NU porni VM $VMID pe $PRIMARY"
echo "3. După stabilizare, migrare înapoi: qm migrate $VMID $PRIMARY --online 0"
} | mail -r 'ups@romfast.ro' -s "[CRITIC] Failover VM $VMID pornit pe $SECONDARY" "$MAIL_TO"
log "=== Failover complet ==="