#!/bin/bash
# 실습 #18 ③ — systemd 서비스 페일오버 (nginx) + VIP 와 그룹화
# - systemd:nginx 리소스로 등록 → Pacemaker 가 시작·중지·monitor 담당
# - vip + nginx 를 group 으로 묶으면 항상 같은 노드에서 함께 동작
# - 노드 죽으면 그룹 통째로 다른 노드로 이전
set -e

# 1) 양쪽 노드에 nginx 설치 (이미 깔려 있으면 skip)
if ! command -v nginx >/dev/null; then
    sudo apt install -y nginx
fi

# 2) Pacemaker 가 관리 → 부팅 시 자동 시작은 끔
sudo systemctl disable --now nginx 2>/dev/null || true

# 3) 노드별로 다른 페이지 (어느 노드 응답인지 구분)
echo "<h1>nginx on $(hostname)</h1>" | sudo tee /var/www/html/index.html >/dev/null

# 4) 기존 자원 정리
sudo pcs resource delete web_nginx 2>/dev/null || true
sudo pcs resource delete web 2>/dev/null || true

# 5) nginx 리소스 생성
sudo pcs resource create web_nginx \
    systemd:nginx \
    op monitor interval=10s timeout=30s

# 6) vip 와 nginx 그룹화 — 같은 노드에서, vip 먼저 → nginx
#    group 으로 묶으면 colocation + order 가 자동 적용
sudo pcs resource group add web web_vip web_nginx 2>/dev/null || true

sleep 3
echo "=== pcs status ==="
sudo pcs status

# 7) 어느 노드에서 동작하는지
echo
NODE=$(sudo pcs status resources | grep web_nginx | awk '{print $NF}')
echo "→ web group 활성 노드: $NODE"

# 8) VIP 응답 — 어느 노드의 페이지가 나오나
VIP="${VIP:-192.168.56.100}"
sleep 2
echo
echo "=== curl http://$VIP ==="
curl -s --max-time 5 "http://$VIP" || echo "(외부에서 curl 권장: 다른 머신에서 ping/curl)"

# 9) 페일오버 시연 — 현재 노드 standby
echo
echo "=== $NODE standby (그룹 통째로 이전) ==="
sudo pcs node standby "$NODE"
sleep 8

sudo pcs status
NEW_NODE=$(sudo pcs status resources | grep web_nginx | awk '{print $NF}')
echo "→ web group 이동 후: $NEW_NODE"
echo
echo "=== curl http://$VIP (페일오버 후) ==="
curl -s --max-time 5 "http://$VIP" || true

# 10) 복귀
sudo pcs node unstandby "$NODE"
sleep 3
sudo pcs status

cat <<EOF

관전 포인트:
  - group 으로 묶으면 colocation INFINITY + order 자동 (= 따로 안 적어도 됨)
  - 페일오버 동안 사용자는 VIP 만 보면 됨 (안쪽 노드 어디든)
  - 운영은 monitor interval 10s + timeout 30s 보다 짧게 (= 빠른 탐지)
  - 단, 너무 짧으면 false positive 폭주 → 5s/15s 정도가 균형
EOF
