Heartbeat, gestion de la route par défaut

J’ai récemment mis en place un cluster Heartbeat/HAProxy en actif/actif. L’article sur la mise en place va bientôt arriver. J’ai été confronté à un soucis sur la gestion de la route par défaut, ce qui m’a amené au ‘développement’ d’un script HB pour la gérer.

Constat

Mes VIP sont publiques, et afin d’économiser les IPs, j’ai choisi de ne pas affecter d’IP à l’interface qui supportent les VIP. Avec les directives post-up, on peut définir une route par défaut dans le fichier /etc/network/interfaces. Le soucis c’est que si pour une raison quelconque, la/les VIPs basculent du noeud A vers le noeud B, la route par défaut est également supprimée.
De fait, si on veut rebasculer les VIPs sur le noeud A, rien ne marche car pas de route par défaut.

Solution

Voici donc un petit script à placer dans /etc/ha.d/resource.d/

#!/bin/bash
args=("$@")

if [ ${args[1]} == « start » ]; then

ROUTE=`echo $1 | sed ‘s%/.*%%’`
str=`echo $1 | sed ‘s%^’$ROUTE’/*%%’`

if [ ! -z « $str » ]; then
DEV=`echo $str | sed ‘s%/.*%%’`
str=`echo $str | sed ‘s%^’$DEV’/*%%’`
GW=`echo $str | sed ‘s%/.*%%’`
route add $ROUTE dev $DEV
route add default gw $ROUTE
exit 0

fi

exit 0
fi
Et la syntaxe pour l’utiliser dans le fichier haresources :

nodeA IPaddr2::1.1.1.1/24/eth0:0/1.1.1.255 IProute2::1.1.1.254/eth0
nodeB IPaddr2::1.1.1.2/24/eth0:0/1.1.1.255 IProute2::1.1.1.254/eth0

Vous vous demandez pourquoi il y a des ‘exit 0’ à la fin des ‘if’, c’est tout simplement car de base les 2 noeuds sont actifs, donc possède déjà la route par défaut.
Quand le noeud A meure alors la VIP bascule. Si on cherche à créer la route par défaut sur le noeud Bcela génère une erreur car elle existe déjà.
Cette erreur met en défaut heartbeat qui considère que la commande ne s’est pas bien terminée (et il a raison) et du coup il libère la VIP.
Le ‘exit 0’ permet de faire croire à heartbeat que la commande a abouti et qu’il peut donc garder la VIP.