263 lines
4.6 KiB
Bash
263 lines
4.6 KiB
Bash
#!/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 "========================================="
|