6.16.6 ユーザコマンドのコーディング例

ユーザコマンドのコーディング例として,サーバのIPアドレスを切り替える処理の例について説明します。(1)では,コーディング例の一部分を取り上げて,ユーザコマンドのコーディング方法を説明します。(2)では,コーディング例全体を示します。

なお,サーバのIPアドレスを切り替える処理は,LANの状態設定ファイルを設定する方法でも実現できます。LANの状態設定ファイルを設定する場合,ユーザコマンドの作成は不要です。

<この項の構成>
(1) コーディング例で示すユーザコマンドの説明
(2) コーディング例

(1) コーディング例で示すユーザコマンドの説明

サーバが使用するIPアドレスを,次のタイミングで追加・削除する場合について説明します。

これらのタイミングを次に示します。図中で示す番号は,コーディング例の一部分と対応しています。

図6-42 ユーザコマンドのコーディング例で示す発行タイミング

[図データ]

ユーザコマンドのコーディング例と発行タイミングの対応を次に示します。

図6-43 ユーザコマンドのコーディング例と発行タイミングの対応

[図データ]

(1)では,サーバ起動時(サーバ起動処理の開始時点)に実行サーバで実行したい処理を記述します。この例では,IPアドレスを追加するコマンドとしてipaddr_addを記述しています。

(2)では,サーバ起動時(サーバ起動処理の開始時点)に待機サーバで実行したい処理を記述します。この例では何も実行しないため,何も記述していません。

(3)では,実行サーバ障害時(障害処理の開始時点)に実行サーバで実行したい処理を記述します。この例では,IPアドレスを削除するコマンドとしてipaddr_deleteを記述しています。

(4)では,実行サーバ障害時(障害処理の開始時点)に待機サーバで実行したい処理を記述します。この例では,IPアドレスを追加するコマンドとしてipaddr_addを記述しています。

(1)から(4)の発行タイミングごとに,HAモニタから渡される変数とHAモニタが発行するユーザコマンドの対応を次に示します。

表6-15 HAモニタから渡される変数とHAモニタが発行するユーザコマンドの対応

発行タイミングの番号$4$5$6HAモニタが発行するユーザコマンド
(1)online-sstart/usr/bin/usrcmd -n server -k online -s start
(2)standby-sstart/usr/bin/usrcmd -n server -k standby -s start
(3)online-astart/usr/bin/usrcmd -n server -k online -a start
(4)standby-astart/usr/bin/usrcmd -n server -k standby -a start

注※ ユーザコマンド名およびサーバ識別名はそれぞれ次を仮定しています。


(2) コーディング例

このコーディング例は,サンプルファイルとしてHAモニタのサンプルファイル用ディレクトリの下に格納されています。

#!/bin/sh

# The definition of the 1st server
SERV1="server1"
IPADDR_SERV1="a.b.c.d"
BROADCAST_SERV1="e.f.g.h"
IFNAME_SERV1="ethX:Y1"

# The definition of the 2nd server
SERV2="server2"
IPADDR_SERV2="i.j.k.l"
BROADCAST_SERV2="m.n.o.p"
IFNAME_SERV2="ethX:Y2"

# The alias IP address is added to the LAN interface.
# The ARP caches are updated.
ipaddr_add()
{
       /sbin/ifconfig $WIFNAME inet $WIPADDR netmask 255.255.255.0 broadcast $WBROADCAST
       ARPIFNAME=`echo $WIFNAME | /bin/sed -e 's/:[0-9]*$//'`
       /sbin/arping -U -c 2 -I $ARPIFNAME $WIPADDR
       /bin/echo 0 > /proc/sys/net/ipv4/route/flush
       return 0
}

# The alias IP address is deleted from the LAN interface.
ipaddr_delete()
{
       /sbin/ifconfig $WIFNAME down
       /bin/echo 0 > /proc/sys/net/ipv4/route/flush
       return 0
}

#  Main
KIND_ONLINE="online"
KIND_STANDBY="standby"
SERV_START="-s"
SERV_END="-e"
SERV_PLANEND="-p"
SERV_ABORT="-a"
SERV_ABORT_NS="-o"
SERV_FAULT="-f"
SERV_HOSTDOWN="-h"
SERV_PLANSWAP="-w"
STATUS_START="start"
STATUS_END="end"
STATUS_SBYEND="sbyend"

# This user command terminates, when the state of HAmonitor has changed.
if [ "$1" = "-m" ]
then
       exit  1
fi

# Processing of the server
for serv in $SERV1 $SERV2
do
       if [ "$2" = "$serv" ]
       then
               case "$serv" in
               "$SERV1" )
                       WIPADDR="$IPADDR_SERV1"
                       WBROADCAST="$BROADCAST_SERV1"
                       WIFNAME="$IFNAME_SERV1"
                       ;;
               "$SERV2" )
                       WIPADDR="$IPADDR_SERV2"
                       WBROADCAST="$BROADCAST_SERV2"
                       WIFNAME="$IFNAME_SERV2"
                       ;;
               esac

               if [ "$4" = "$KIND_ONLINE" ]
               then
                       case "$5" in
                       "$SERV_START" )
                               [ "$6" = "$STATUS_START" ] && ipaddr_add
                               ;;
                       "$SERV_END" )
                               ipaddr_delete
                               ;;
                       "$SERV_PLANEND" )
                               ipaddr_delete
                               ;;
                       "$SERV_ABORT" )
                               [ "$6" = "$STATUS_START" ] && ipaddr_delete
                               ;;
                       "$SERV_ABORT_NS" )
                               [ "$6" = "$STATUS_START" ] && ipaddr_delete
                               ;;
                       "$SERV_PLANSWAP" )
                               [ "$6" = "$STATUS_START" ] && ipaddr_delete
                               ;;
                       esac

               else
                       case "$5" in
                       "$SERV_START" )
                               ;;
                       "$SERV_END" )
                               ;;
                       "$SERV_PLANEND" )
                               ;;
                       "$SERV_ABORT" )
                               [ "$6" = "$STATUS_START" ] && ipaddr_add
                               ;;
                       "$SERV_FAULT" )
                               ipaddr_delete
                               ;;
                       "$SERV_HOSTDOWN" )
                               [ "$6" = "$STATUS_START" ] && ipaddr_add
                               ;;
                       "$SERV_PLANSWAP" )
                               [ "$6" = "$STATUS_START" ] && ipaddr_add
                               ;;
                       esac
               fi
       fi
done

exit 0