#!/bin/bash
# Failover für Proxmox-hosts.
# Script am besten als systemd-Service auf allen hosts integrieren, die ein Failover durchfüren sollen.
# Bei Hosts, die als Backup eines Failoverhosts dienen sollen, Sollte man die SLEEPTIME passend erhöhen.
# Vorraussetzung ist ein konfigurierter Postfix, um Benachrichtgungen zu versenden
# mutt als mailclient
# nmap um fehlende Dienste zu identifizieren
# sshpass falls man ohne public key authentication arbeiten möchte.
# Letzteres ist in lokalen Netzen m.E. durchaus vertretbar.
# Wichtig ist die qemu-guest agents auf den zu behandelnden Gästen installiert und aktiviert sind.
# Sonst klappt der shutdown nicht.
MAILTO="mail@irgendwer.de"
SLEEPTIME=30 # wir prüfen hier alle 30s solange kein DELAY-Wert die Spanne verlängert.
DELAY200=360 # wir warten VM-individuell sicherheitshalber x Sekunden bis die Master-VM wieder am Start sind.
DELAY400=120 # Die Werte sind wichtig, damit wir uns nicht selbst überholen.
DELAY107=30 # Die Werte sind wichtig, damit wir uns nicht selbst überholen.
DELAY112=120 # Die Werte sind wichtig, damit wir uns nicht selbst überholen.
# Lieber hoch einsteigen und ggfs. reduzieren.
MASTERPVE="192.168.100.201"
PIHOLEIP="192.168.100.251"
#GUACAMOLEIP="192.168.100.197"
SSHPROXYIP="192.168.100.250"
while true; do
sleep $SLEEPTIME
RUNNING400=`nmap -p 67 -sU $PIHOLEIP | grep open | wc -l`
# RUNNING200=`nmap -p 8080 $GUACAMOLEIP | grep open | wc -l`
RUNNING200=`nmap -p 8080 gua | grep open | wc -l`
RUNNING107=`nmap -p 8123 homeassistant | grep open | wc -l`
RUNNING112=`nmap -p 22 $SSHPROXYIP | grep open | wc -l`
MAYBESTOP400=`pct status 400 | grep running | wc -l`
MAYBESTOP200=`pct status 200 | grep running | wc -l`
MAYBESTOP107=`qm status 107 | grep running | wc -l`
MAYBESTOP112=`qm status 112 | grep running | wc -l`
if [ $RUNNING400 == 0 ]; then
echo "Dienst pihole ist im Netz nicht erreichbar."
pct start 400
echo "FAILOVER TES: pihole LXC400 wurde auf PVE gestartet. Bitte kontrollieren und ggf. manuell stoppen, sobald der Master wieder betriebsbereit ist." | mutt -s "FAILOVER TES Pihole von PVE1 auf PVE" -- $MAILTO
fi
if [ $RUNNING200 == 0 ]; then
echo "Dienst guacamole ist im Netz nicht erreichbar."
pct start 200
echo "FAILOVER TES: Guacamole LXC200 wurde auf PVE gestartet. Bitte kontrollieren und ggf. manuell stoppen, sobald der Master wieder betriebsbereit ist." | mutt -s "FAILOVER TES Guacamole von PVE1 auf PVE" -- $MAILTO
fi
if [ $RUNNING107 == 0 ]; then
echo "Dienst homeassistant ist im Netz nicht erreichbar."
qm start 107
echo "FAILOVER TES: Homeassistant VM107 wurde auf PVE gestartet. Bitte kontrollieren und ggf. manuell stoppen, sobald der Master wieder betriebsbereit ist." | mutt -s "FAILOVER TES Homeassistant von PVE1 auf PVE" -- $MAILTO
fi
if [ $RUNNING112 == 0 ]; then
echo "Dienst ssh-proxy ist im Netz nicht erreichbar."
qm start 112
echo "FAILOVER: ssh-Proxy VM112 wurde auf PVE gestartet. Bitte kontrollieren und ggf. manuell stoppen, sobald der Master wieder betriebsbereit ist." | mutt -s "FAILOVER TES: SSH-Proxy läuft nun auf PVE" -- $MAILTO
fi
if [ $MAYBESTOP400 == 1 ]; then
echo "Failover LXC400 (pihole) aktiv."
# Wir prüfen ob der Master wieder läuft
SHUTDOWN400=`sshpass -p 'GeheimPW' ssh root@$MASTERPVE pct list | grep 400 | grep running | wc -l`
if [ $SHUTDOWN400 == 1 ]; then
echo "Master pihole wieder aktiv Failover wird deaktiviert."
pct shutdown 400
echo "FAILOVER TES beendet: Master pihole wieder aktiv." | mutt -s "RECOVER TES: pihole läuft wieder auf PVE1" -- $MAILTO
sleep $DELAY400
fi
fi
if [ $MAYBESTOP200 == 1 ]; then
echo "Failover LXC200 (guacamole) aktiv."
# Wir prüfen ob der Master wieder läuft
SHUTDOWN200=`sshpass -p 'GeheimPW' ssh root@$MASTERPVE pct list | grep 200 | grep running | wc -l`
if [ $SHUTDOWN200 == 1 ]; then
echo "Master guacamole wieder aktiv Failover wird deaktiviert."
pct shutdown 200
echo "FAILOVER TES beendet: Master guacamole wieder aktiv." | mutt -s "RECOVER TES: guacamole läuft wieder auf PVE1" -- $MAILTO
sleep $DELAY200
fi
fi
if [ $MAYBESTOP107 == 1 ]; then
echo "Failover VM107 (homeassistant) aktiv."
# Wir prüfen ob der Master wieder läuft
SHUTDOWN107=`sshpass -p 'GeheimPW' ssh root@$MASTERPVE qm list | grep 107 | grep running | wc -l`
if [ $SHUTDOWN107 == 1 ]; then
echo "Master homeassistant wieder aktiv Failover wird deaktiviert."
qm shutdown 107
echo "FAILOVER TES beendet: Master homeassistant wieder aktiv." | mutt -s "RECOVER TES: homeassistant läuft wieder auf PVE1" -- $MAILTO
sleep $DELAY107
fi
fi
if [ $MAYBESTOP112 == 1 ]; then
echo "Failover VM112 SSH-Proxy aktiv."
# Wir prüfen ob der Master wieder läuft
SHUTDOWN112=`sshpass -p 'GeheimPW' ssh root@$MASTERPVE qm list | grep 112 | grep running | wc -l`
if [ $SHUTDOWN112 == 1 ]; then
echo "Master SSH-Proxy wieder aktiv Failover wird deaktiviert."
qm shutdown 112
echo "FAILOVER TES beendet: Master SSH-Proxy wieder aktiv." | mutt -s "RECOVER TES: SSH-Proxy läuft wieder auf PVE1" -- $MAILTO
sleep $DELAY112
fi
fi
done