Added first version. This script generates a complete high-availability setup by asking for your service details and then automatically creating Keepalived VRRP configuration files, Systemd service units, and a visual failover diagram for a multi-node active/passive cluster with automatic VIP failover.

This commit is contained in:
2026-05-10 12:31:45 +01:00
parent 98c0766851
commit 5106516286
+262
View File
@@ -0,0 +1,262 @@
#!/usr/bin/env bash
echo "========================================="
echo " Keepalived HA Full Stack Generator"
echo " (Configs + Systemd + Diagram)"
echo "========================================="
echo ""
read -p "Service name (e.g. DNS / API / Nginx): " SERVICE
read -p "MASTER Router ID: " MASTER_ID
read -p "MASTER node IP: " MASTER_IP
echo ""
read -p "How many BACKUP nodes? " BACKUP_COUNT
declare -a BACKUP_IDS
declare -a BACKUP_IPS
for ((i=1; i<=BACKUP_COUNT; i++))
do
echo "-----------------------------------"
echo "Backup #$i"
read -p "Router ID: " RID
read -p "Node IP: " IP
BACKUP_IDS[$i]=$RID
BACKUP_IPS[$i]=$IP
done
echo ""
read -p "How many VIP instances? " INSTANCE_COUNT
echo ""
read -p "Use health check script? (y/n): " USE_SCRIPT
if [[ "$USE_SCRIPT" == "y" ]]; then
read -p "Health check script path: " HEALTH_SCRIPT
else
HEALTH_SCRIPT=""
fi
MASTER_CONF="keepalived-${SERVICE}-${MASTER_ID}.conf"
BACKUP_PREFIX="keepalived-${SERVICE}-backup"
SYSTEMD_DIR="systemd-${SERVICE}"
DIAGRAM_FILE="${SERVICE}-ha-diagram.md"
mkdir -p "$SYSTEMD_DIR"
# ---------------- SYSTEMD ----------------
cat > "$SYSTEMD_DIR/keepalived.service" <<EOF
[Unit]
Description=Keepalived High Availability Service ($SERVICE)
After=network-online.target
Wants=network-online.target
[Service]
Type=forking
ExecStart=/usr/sbin/keepalived --dont-fork
ExecReload=/bin/kill -HUP \$MAINPID
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
# ---------------- DIAGRAM HEADER ----------------
cat > "$DIAGRAM_FILE" <<EOF
# $SERVICE High Availability Diagram
\`\`\`mermaid
flowchart LR
VIP[(Virtual IPs)]
MASTER[$MASTER_ID\\n$MASTER_IP]
VIP --> MASTER
EOF
for ((b=1; b<=BACKUP_COUNT; b++))
do
cat >> "$DIAGRAM_FILE" <<EOF
B$b[${BACKUP_IDS[$b]}\\n${BACKUP_IPS[$b]}]
VIP -. failover .-> B$b
EOF
done
cat >> "$DIAGRAM_FILE" <<EOF
style MASTER fill:#4caf50,stroke:#000,color:#fff
style VIP fill:#2196f3,stroke:#000,color:#fff
\`\`\`
EOF
# ---------------- CONFIG FILES ----------------
write_global() {
cat <<EOF
global_defs {
router_id $1
enable_script_security
script_user root
}
EOF
}
write_script() {
if [[ -n "$HEALTH_SCRIPT" ]]; then
cat <<EOF
vrrp_script chk_service {
script "$HEALTH_SCRIPT"
interval 2
timeout 2
rise 2
fall 2
weight -50
}
EOF
fi
}
# MASTER base
write_global "$MASTER_ID" > "$MASTER_CONF"
write_script >> "$MASTER_CONF"
# BACKUP base files
for ((b=1; b<=BACKUP_COUNT; b++))
do
write_global "${BACKUP_IDS[$b]}" > "$BACKUP_PREFIX$b.conf"
write_script >> "$BACKUP_PREFIX$b.conf"
done
# ---------------- INSTANCES ----------------
for ((i=1; i<=INSTANCE_COUNT; i++))
do
echo "-----------------------------------"
echo "Instance #$i"
read -p "Name (e.g. VLAN10 / APP1): " NAME
read -p "Interface (e.g. eth0.10): " IFACE
read -p "VIP (e.g. 192.168.10.3/24): " VIP
read -p "VRID: " VRID
read -p "Auth password: " PASS
PEERS=""
for ((b=1; b<=BACKUP_COUNT; b++))
do
PEERS="$PEERS ${BACKUP_IPS[$b]}"
done
# MASTER
cat >> "$MASTER_CONF" <<EOF
vrrp_instance $NAME {
state MASTER
interface $IFACE
virtual_router_id $VRID
priority 200
advert_int 1
unicast_src_ip $MASTER_IP
unicast_peer {
$PEERS
}
authentication {
auth_type PASS
auth_pass $PASS
}
virtual_ipaddress {
$VIP dev $IFACE
}
EOF
if [[ -n "$HEALTH_SCRIPT" ]]; then
cat >> "$MASTER_CONF" <<EOF
track_script {
chk_service
}
EOF
fi
cat >> "$MASTER_CONF" <<EOF
}
EOF
# BACKUPS
for ((b=1; b<=BACKUP_COUNT; b++))
do
PRIORITY=$((200 - (b * 10)))
[[ $PRIORITY -lt 50 ]] && PRIORITY=50
cat >> "$BACKUP_PREFIX$b.conf" <<EOF
vrrp_instance $NAME {
state BACKUP
interface $IFACE
virtual_router_id $VRID
priority $PRIORITY
advert_int 1
nopreempt
unicast_src_ip ${BACKUP_IPS[$b]}
unicast_peer {
$MASTER_IP
}
authentication {
auth_type PASS
auth_pass $PASS
}
virtual_ipaddress {
$VIP dev $IFACE
}
EOF
if [[ -n "$HEALTH_SCRIPT" ]]; then
cat >> "$BACKUP_PREFIX$b.conf" <<EOF
track_script {
chk_service
}
EOF
fi
cat >> "$BACKUP_PREFIX$b.conf" <<EOF
}
EOF
done
done
echo ""
echo "========================================="
echo " DONE"
echo "========================================="
echo "Configs:"
echo " - $MASTER_CONF"
for ((b=1; b<=BACKUP_COUNT; b++))
do
echo " - $BACKUP_PREFIX$b.conf"
done
echo ""
echo "Systemd:"
echo " - $SYSTEMD_DIR/keepalived.service"
echo ""
echo "Diagram:"
echo " - $DIAGRAM_FILE"
echo "========================================="