oranie's blog

旧:iをgに変えると・・・なんだっけ・・・

Heartbeatで今VIPがどのサーバが持っているかNagiosで確認するスクリプトを作ってみた。

検索してもそれっぽいのが出てこなかったので、とりあえず書いてみた。

目的:メインとサブのHA構成
メイン(host1):192.168.0.2
サブ(host2):192.168.0.3
VIP:192.168.0.1
だった場合に、メンテとかでhb_takeoverを実行したり、
知らず知らずの内にフェイルオーバしていて実はVIPがサブのホストに
渡っていた!というマヌケな事象を防ぐのが目的。

※通常の障害でフェイルオーバした時は、ホストダウンとか他のエラーでちゃんと検知して、
フェイルオーバした事自体に気づかないとかそんなうっかりは無いと思いますがw


前提条件:各HOSTがHTTPリクエストに対して、自身のホスト名を返却出来る事。
普通はどっか適当なファイルにuname -n >>ホニャララ しておけばそれでOK。

スクリプト名はvip_checkとする。

#!/bin/sh

#uname -n で出力されるHOST名を記述する。
MAIN=$1
SUB=$2

#VIPを記述
VIP=$3

RESULT=`wget -q -O - http://${VIP}/`
#もし鍵配布が出来ればsshでuname -nによるホスト名取得。
#RESULT=`ssh $VIP "uname -n"`

#TIMEOUTやエラーだった場合は即時エラー
#HTTP接続自体は成功した場合返却された文字列で判定する
#Nagiosは戻り値で、0:OK 1:warn 2:Criticalと判定するので以下の判定を行う。

if [ $? = 0 ]
then
    case $RESULT in
        $MAIN) echo $RESULT && exit 0;;
        $SUB)  echo $RESULT && exit 2;;
        *)     echo $RESULT && exit 2;;
    esac
else
    echo "Server or VIP down!!"
    exit 2
fi

で、コマンドで実行する場合は
./vip_check host1 host2 192.168.0.1
でhost1にVIPがある時はOKでそれ以外のHOSTや接続に失敗するとCriticalを検知できます。
一応、取得した内容をNagiosのstatusに出力できるようecho $RESULTをしています。
あとはNagiosの設定ファイルに記載する場合は、書式に合わせて引数を$ARG1$・・・とか$HOSTADDRESS$
に変えてあげれば幸せになれると思います。

ざーっと適当に書いたから合っているかな?