[munin] 監視サーバのIPアドレス取得スクリプト修正


前回のエントリーで作成したスクリプトですが、監視サーバからSSHアクセスしてきたタイミングと、監視対象のVPSサーバのログローテーションのタイミングが重なった場合に、監視サーバのIPアドレスが取得できない(ログから拾えない)ことがあるので、その対策を行いました。

なんで気づいたかっていうと、正しくIPアドレスを取得してmunin-nodeの再起動を行ったときの通知メールは

New munin-server is 123.456.789.012

みたいな件名なのですが、IPアドレスの検出ができなかったときの通知メールは、「New munin-server is」で件名が終わっていて、それでいてmunin-nodeの再起動だけは行われてしまってます。で、munin-node.confには

#allow ^123.456.789.012$
allow ^...$

と書かれてしまっているわけです。ちょっと時間をおけば、また監視サーバのIPアドレスのIPアドレスが取得できるっちゃーできるのですが、データの取りこぼしや、munin-nodeの不要な再起動など、よろしくないことばかりです。

そこで、監視サーバのIPアドレス取得スクリプトの修正。やってることは単純で、まずはログに監視サーバのIPアドレスが1行でも記録されているかどうかを判断するif文を追加し、1行も記録されていなかったら何もせず、1行でも記録されていたら、通常のIPアドレス検出→IPアドレスが変更していた場合の処理へと進むようにしています。

以下、変更後のスクリプトです。

#!/bin/sh
LANG=C

ADMIN=【携帯のメールアドレス】
CONFDIR=/etc/munin/
cd $CONFDIR

CF=munin-node.conf
BAK0=munin-node.conf.BAK0
BAK1=munin-node.conf.BAK1

NOW_IP_ADDR=`sudo egrep "^w{3} [ :0-9]{11} [._[:alnum:]-]+ sshd[[0-9]+]: Accepted publickey for watcher0" /var/log/secure | tail -1 | awk '{print $11}'`
OA=`echo $NOW_IP_ADDR | awk 'BEGIN {FS="."}{print $1}'`
OB=`echo $NOW_IP_ADDR | awk 'BEGIN {FS="."}{print $2}'`
OC=`echo $NOW_IP_ADDR | awk 'BEGIN {FS="."}{print $3}'`
OD=`echo $NOW_IP_ADDR | awk 'BEGIN {FS="."}{print $4}'`

ACCEPTED_IP=`tail -1 $CF | sed -e 's/allow ^//' | sed -e 's/\//g' | sed -e 's/$//'`

if [ 0 -eq `egrep "^w{3} [ :0-9]{11} [._[:alnum:]-]+ sshd[[0-9]+]: Accepted publickey for watcher0" /var/log/secure | wc -l` ];
    then
        :
    else
        if [ $NOW_IP_ADDR = $ACCEPTED_IP ];
            then
                :
            else
                # Change config
                if [ -f $BAK1 ];
                    then
                        rm -f $BAK1
                fi
                if [ -f $BAK0 ];
                    then
                        mv $BAK0 $BAK1
                fi
                if [ -f $CF ];
                    then
                        cp -p $CF $BAK0
                fi
                sed -i '$s/^allow/#allow/' $CF
                echo allow ^$OA.$OB.$OC.$OD$ >> $CF
                sudo /etc/init.d/munin-node restart
                echo "`date` munin-node restarted" | mail -s "New munin-server is $NOW_IP_ADDR" $ADMIN
        fi
fi

毎度毎度へっぽこスクリプトでごめんなさい。。。