إعداد عنوان 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 الذي يتم تشغيل هذا البرنامج النصي عليه من رئيسي إلى تابع |