Richten Sie eine virtuelle IP-Adresse mit Pre- und Post-Skripten ein

Es ist möglich, ein Pre- und ein Post-Skript anzugeben, wenn ein Wechsel der Master / 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 gehört nicht zur SKOOR-Softwareverteilung. Der Einfachheit halber finden Sie unten jedoch ein Beispiel.

Man kann für die Optionen pre_script und post_script dasselbe Skript angeben , wie es im obigen Beispiel der Fall ist. Pre-/Post-Skripte werden beendet, wenn sie nicht innerhalb des angegebenen Timeouts (Einheiten sind Sekunden) beendet werden.

Anwendungsfall:

Binden und lösen Sie eine virtuelle hochverfügbare IP-Adresse an die Netzwerkschnittstelle des aktuellen Masters , wenn Sie Master / Slave -Rollen wechseln. Wenn auf dem aktuellen Slave ein Wechsel vorgenommen wird, werden die Pre- und Post-Skripte in der folgenden Reihenfolge ausgeführt:

Skript

auf dem System

Aktion

vor_Skript

aktueller Slave

nichts tun

vor_Skript

aktueller Master

Aufheben der Bindung der HA-IP-Adresse

Kernarbeit von Server

 

Führen Sie den eigentlichen Wechsel der Master / Slave -Funktionalität durch

post_script

neuer Master

bindet die HA-IP-Adresse 10.1.0.90

post_script

neuer Slave

nichts tun

Im obigen Beispiel stellt 10.1.0.90 die virtuelle HA-IP-Adresse dar.

Wenn der Master vom Slave aus nicht erreichbar ist, werden Pre- und Post-Skripte auf dem alten Master weggelassen.

Unten sehen Sie ein Beispiel für das Pre-/Post-Skript /opt/eranger/sbin/vip-switch.sh   bindet/löst die HA-IP-Adresse 10.1.0.90 (Netzmaske 255.255.254.0) an/von der Netzwerkschnittstelle eth0 auf dem aktuellen Master .

#!/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 Dollar

IP-Adresse des neuen Master

$2

Muster „pre“ oder „post“, um zu bestimmen, ob das Skript Vor- oder Nachaufgaben ausführen soll.

$3

Muster „m2s“ oder „s2m“ mit der Bedeutung:

Der m2s-Host, auf dem dieses Skript ausgeführt wird, sollte von Master auf Slave umgestellt werden
Der s2m-Host, auf dem dieses Skript ausgeführt wird, sollte von Slave zu Master konvertiert werden