global_defs { router_id {{ .RouterID }} script_user root enable_script_security # GARP: beim Master-Wechsel Gratuitous-ARP forciert senden (repeat) UND # periodisch auffrischen (master_refresh) — sonst lässt der Upstream-Switch # die VIP-MAC altern und die Failover-IP wird nach Minuten unerreichbar. # Ergänzt durch den Priming-Ping in keepalived-master.sh (Traffic AUS der VIP). # (vrrp_garp_interval/gna NICHT setzen: keepalived 2.3.x lehnt 0 ab, Default passt.) vrrp_garp_master_repeat 5 vrrp_garp_master_refresh 60 } {{/* KEIN weight: in einer vrrp_sync_group ignoriert keepalived gewichtete Track-Scripts ("ignoring tracked script ... with weights due to SYNC group") → die Health-Checks wären wirkungslos. Ohne weight wirken sie als binäre FAULT-Trigger: schlägt ein Check fall-mal in Folge fehl, geht die Instanz (und via Sync-Group der ganze Node) in FAULT → der gesunde Peer übernimmt. Für einen 2-Node-Cluster die saubere Semantik. */}} vrrp_script chk_edgeguard { script "/usr/lib/edgeguard/keepalived-check.sh" interval 2 fall 8 rise 2 } {{ if .GWCheckIP }} vrrp_script chk_gateway { script "/usr/lib/edgeguard/keepalived-gw-check.sh {{ .GWCheckIP }}" interval 5 fall 5 rise 2 } {{ end }} {{ if .HBInterface }} vrrp_sync_group VG_1 { group { VI_1 VI_HB } } {{ end }} vrrp_instance VI_1 { state {{ .State }} interface {{ .Interface }} virtual_router_id {{ .RouterID }} priority {{ .Priority }} advert_int 2 nopreempt {{ if .SrcIP }} unicast_src_ip {{ .SrcIP }} unicast_peer { {{ .PeerIP }} } {{ end }} authentication { auth_type PASS auth_pass {{ .AuthPass }} } virtual_ipaddress { {{ range .VIPs }} {{ .Address }}/{{ .Prefix }} dev {{ .Device }} {{ end }} } track_script { chk_edgeguard {{ if .GWCheckIP }} chk_gateway {{ end }} } notify_master "/usr/lib/edgeguard/keepalived-master.sh" notify_backup "/usr/lib/edgeguard/keepalived-backup.sh" notify_fault "/usr/lib/edgeguard/keepalived-backup.sh" } {{ if .HBInterface }} vrrp_instance VI_HB { state {{ .State }} interface {{ .HBInterface }} virtual_router_id {{ .HBRouterID }} priority {{ .Priority }} advert_int 2 nopreempt {{ if .HBSrcIP }} unicast_src_ip {{ .HBSrcIP }} unicast_peer { {{ .HBPeerIP }} } {{ end }} authentication { auth_type PASS auth_pass {{ .AuthPass }} } } {{ end }}