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:
@@ -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 "========================================="
|
||||
Reference in New Issue
Block a user