إعداد عنوان IP افتراضي باستخدام البرامج النصية المسبقة واللاحقة

من الممكن تحديد برنامج نصي مسبق وبرنامج نصي لاحق عند إصدار تبديل وظيفة رئيسي/عبد. يمكن تكوين المسار المطلق لهذين البرنامجين النصيين في eranger-replication. cfg

...
## 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

لا ينتمي النص البرمجي أعلاه إلى توزيع برنامج SKOOR. ومع ذلك، وللتسهيل، هناك مثال متوفر أدناه.

يمكن للمرء توفير نفس النص البرمجي للخيارpre_script والخيار post_script، كما هو الحال في المثال أعلاه. سيتم إنهاء النصوص البرمجية السابقة/البعدية إذا لم تخرج خلال المهلة المحددة (الوحدات بالثواني).

حالة الاستخدام:

ربط وإلغاء ربط عنوان IP الظاهري عالي التوفر بواجهة الشبكة الرئيسية الحالية عند تبديل الأدوار الرئيسية/التبعية. عندما يتم إصدار تبديل على العبد الحالي، يتم تشغيل النصوص البرمجية السابقة واللاحقة بالترتيب التالي:

البرنامج النصي

على النظام

الإجراء

النص البرمجي النصي المسبق

العبد الحالي

لا تفعل شيئًا

نص مسبق

الرئيسي الحالي

إلغاء ربط عنوان IP الخاص ب HA-IP

العمل الأساسي ل eranger-server-replication.pl

تنفيذ التبديل الفعلي للوظيفة الرئيسية/التبعية

ما بعد_النص

سيد جديد

ربط عنوان بروتوكول الإنترنت HA-IP 10.1.0.90

ما بعد_النص

عبد جديد

لا تفعل شيئًا

في المثال أعلاه 10.1.0.90 يمثل عنوان HA-IP الافتراضي.

إذا لم يكن بالإمكان الوصول إلى السيد من العبد، سيتم حذف النصوص القبلية والبعدية على السيد القديم.

المثال أدناه قبل/بعد النص البرمجي النصي /opt/eranger/sbin/vip-switch.sh أدناه يقوم بربط/فك ربط عنوان HA-IP 10.1.0.90 (قناع الشبكة 255.255.254.0) من/إلى/من واجهة الشبكة eth0 على السيد الحالي.

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

يتم دائمًا استدعاء البرامج النصية السابقة واللاحقة بالوسائط الثلاثة التالية:

$1

عنوان IP للسيد الجديد

$2

نمط "ما قبل" أو "ما بعد" لتحديد ما إذا كان يجب على البرنامج النصي القيام بمهام ما قبل أو ما بعد.

$3

النمط "m2s" أو "s2m" بمعنى

يجب تحويل مضيف m2s الذي يتم تشغيل هذا البرنامج النصي عليه من رئيسي إلى تابع
يجب تحويل مضيف s2m الذي يتم تشغيل هذا البرنامج النصي عليه من تابع إلى رئيسي