前回のエントリーで作成したスクリプトですが、監視サーバから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
毎度毎度へっぽこスクリプトでごめんなさい。。。