Einrichten einer virtuellen IP-Adresse mithilfe von Pre- und Post-Skripten
Es ist möglich, ein Pre- und ein Post-Skript anzugeben, wenn ein Wechsel der Primary/Slave-Funktionalität erfolgt. Der absolute Pfad zu diesen Skripten kann in eranger-replication. cfg konfiguriert werden
... ## scripts to be executed before and after switch [scripts] pre_script=/opt/eranger/sbin/vip-switch.sh post_script=/opt/eranger/sbin/vip-switch.sh # pre_timeout=30 # post_timeout=30
Das obige Skript ist nicht Teil der SKOOR Software Distribution. Der Einfachheit halber ist jedoch unten ein Beispiel angegeben.
Man kann das gleiche Skript für die pre_script- und die post_script-Optionbereitstellen , wie es im obigen Beispiel der Fall ist. Pre-/Post-Skripte werden abgebrochen, wenn sie nicht innerhalb der angegebenen Zeitspanne beendet werden (Einheiten sind in Sekunden).
Anwendungsfall:
Binden und Aufheben der Bindung einer virtuellen Hochverfügbarkeits-IP-Adresse an die Netzwerkschnittstelle des aktuellen Masters beim Wechsel der Primary/Slave-Rolle. Wenn ein Wechsel auf dem aktuellen Standby erfolgt, werden die Pre- und Post-Skripte in der folgenden Reihenfolge ausgeführt:
Skript | auf dem System | Aktion |
Pre_Skript | aktueller Standby-Slave | nichts tun |
vor_script | aktueller Primary | Bindung der HA-IP-Adresse aufheben |
Kernarbeit von eranger-server-replication.pl |
| den eigentlichen Wechsel der Primary/Slave-Funktionalität durchführen |
post_script | neuer Primary | Binden der HA-IP-Adresse 10.1.0.90 |
post_script | neuer Standby | nichts tun |
Im obigen Beispiel steht 10.1.0.90 für die virtuelle HA-IP-Adresse.
Wenn der Master vom Standby nicht erreichbar ist, werden die Pre- und Post-Skripte auf dem alten Primary weggelassen.
Im folgenden Beispiel bindet/entbindet das Pre-/Post-Skript /opt/eranger/sbin/vip-switch.sh die HA-IP-Adresse 10.1.0.90 (Netzmaske 255.255.254.0) an/von der Netzwerkschnittstelle eth0 auf dem aktuellen Primary.
#!/bin/bash
#
# vip-switch.sh
#
# A script to configure virtual hosting on the WTC eRanger platform
#
# Versions: 2016-02-09 / Port from FreeBSD to RHEL
#
# Arguments:
# $1 -> IP address of new master (not used here)
# $2 -> mode (pre/post)
# $3 -> switch direction (m2s/s2m)
#
# Functionality:
# m2s mode -> remove ip ${VIP} from interface ${BASE_INT} in pre
# -> do nothing in post
#
# s2m mode -> do nothing in pre
# -> add ip ${VIP} as alias to interface ${BASE_INT} in post
#
## CONFIG ##
VIP="10.1.0.90"
VWP="${VIP}/25"
NETMASK="255.255.255.128"
BASE_INT="eth0"
ALIAS_INT="eth0:0"
CONFFILE="/etc/sysconfig/network-scripts/ifcfg-${ALIAS_INT}"
## CONSTS ##
IF="/sbin/ip"
GREP="/bin/grep"
PING="/bin/ping"
## METHODS ##
function usage {
echo "Usage: $0 <master> <pre/post> <mode>"
echo " master : the ip address of the new master"
echo " pre/post: in which phase to run the script"
echo " mode : either \"m2s\" or \"s2m\""
exit 1
}
## CHECKS ##
for b in ${IF} ${GREP} ${PING}; do
if [ ! -x ${b} ]; then
echo "ERR> ${b} not available, exiting..."
exit 1
fi
done
if [ "x${VIP}" == "x" -o "x${BASE_INT}" == "x" ]; then
echo "ERR> Necessary config missing, exiting..."
exit 1
fi
${IF} addr list ${BASE_INT} &>/dev/null
if [ $? -ne 0 ]; then
echo "ERR> Base interface ${BASE_INT} is not available, exiting..."
exit 1
fi
# parse args
pp=$2
mode=$3
if [ "x${pp}" != "xpre" -a "x${pp}" != "xpost" ]; then
usage
fi
if [ "x${mode}" != "xs2m" -a "x${mode}" != "xm2s" ]; then
usage
fi
if [ ${mode} == "s2m" ]; then
# script is running on new master
if [ "x${pp}" == "xpre" ]; then
# only doing stuff in post
exit 0
fi
# safety check
${IF} addr list ${BASE_INT} 2>/dev/null | ${GREP} -q "inet ${VWP}" &>/dev/null
if [ $? -eq 0 ]; then
echo "OK> VIP ${VIP} is already defined on ${BASE_INT}"
exit 0
fi
# is VIP up on slave?
${PING} -c 1 -n -W 2 ${VIP} &>/dev/null
if [ $? -eq 0 ]; then
# ip is still pingable
echo "ERR> ${VIP} is still up on slave, exiting"
exit 1
fi
# we are new master, VIP is down -> add VIP
${IF} addr add ${VWP} dev ${BASE_INT} label ${ALIAS_INT} &>/dev/null
if [ $? -ne 0 ]; then
echo "ERR> Failed to add IP ${VIP} to ${BASE_INT}"
exit 1
else
echo "OK> ${VIP} added to ${BASE_INT}."
# need to create CONFFILE in case server is rebooted -> VIP would be lost then
cat << EOF > ${CONFFILE}
DEVICE=${ALIAS_INT}
IPADDR=${VIP}
NETMASK=${NETMASK}
EOF
if [ $? -eq 0 ]; then
echo "OK> ${VIP} configured in ${CONFFILE}."
else
echo "ERR> ${VIP} not configured in ${CONFFILE}."
fi
exit 0
fi
else
# script is running on new slave
if [ "x${pp}" == "xpost" ]; then
# nothing to do
exit 0
fi
# safety check
${IF} addr list ${BASE_INT} 2>/dev/null | ${GREP} -q "inet ${VWP}" &>/dev/null
if [ $? -ne 0 ]; then
echo "OK> VIP ${VIP} is not defined on ${BASE_INT}"
exit 0
fi
# eranger is about to be switched -> remove VIP
${IF} addr del ${VWP} dev ${BASE_INT} label ${ALIAS_INT} &>/dev/null
if [ $? -ne 0 ]; then
echo "ERR> Failed to remove IP ${VIP} from ${BASE_INT}"
exit 1
else
echo "OK> ${VIP} removed from ${BASE_INT}"
# need to remove CONFFILE now
rm -f ${CONFFILE}
exit 0
fi
fi
exit 0
Die Pre- und Post-Skripte werden immer mit den folgenden drei Argumenten aufgerufen:
$1 | IP-Adresse des neuen Primary |
$2 | Muster "pre" oder "post", um zu bestimmen, ob das Skript Pre- oder Post-Aufgaben durchführen soll. |
$3 | Muster "m2s" oder "s2m" mit der Bedeutung: m2s-Host, auf dem dieses Skript läuft, soll von Master auf Slave umgestellt werden |