ESXiの特定のログで特定のメッセージが出た際にvCSAからメールが送信されるように仕込む

前回前々回の記事は標題の内容が実施したかったための準備だった。
本記事で紹介するスクリプトを理解するためには前提になるので、まだ読んでいない方は一読してほしい。
この記事では、ESXi の任意のログファイルに任意の文字列が記録された際に、vCSA 経由で任意のメッセージを送信するための雛形となるスクリプトを紹介する。



雛形スクリプト

以下のスクリプト (monitorLogFileAndInvokeAction.sh) を作成した
#!/bin/sh
logfile="/var/run/log/vmkernel.log"
message="hogehogehoge"
vcsa_ipaddress="<vcsa_ip>"
id_rsa_filepath="<path_to_privatekey>"
sender_address="<address sent from>"
rcpt_address=<address sent to>
action(){
   ssh -i $id_rsa_filepath  $vcsa_ipaddress "echo $1 | sendmail -v -f $rcpt_address $sender_address"
}
monitorLogFileAndInvokeAction () {
tail -fn0 $logfile | \
   while read line; do
      echo "$line" | grep "$message"
      if [ $? = 0 ]
      then
          action "`date`"
      fi
   done
}
monitorLogFileAndInvokeAction 


太字に部分は、環境や目的に合わせて適切な値を代入する必要がある。
今回の例では、監視するログファイルとして vmkernel.log を指定し、トリガーとなるメッセージとして hogehogehoge を指定している。 
また、メール本文にはメッセージを検出した時刻を入力している

 

 


バックグラウンドで実行させる

 作成したスクリプトを実行するわけだが、このまま実行してももちろん動作するのだが、普通に実行してしまうと、Shell や SSH をログアウト/切断したタイミングで、スクリプトも停止してしまう。それでは不便な場合も多いと思われるので、Shell や SSH をログアウト/切断したあともバックグラウンドで実行したい。

 

バックグラウンドで実行する方法はいくつか考えられる

  • cronに仕込む 
  • 起動時に実行される local.sh に仕込む
  • nohup や setsid などで切断後も継続実行できるようにする

 cron については、cron の定期実行ジョブとして仕込んでおくだけである。といっても定期的に実行したいわけではないので年一回に設定する必要がある。ただしこの場合は、油断すると1年後にもう一度実行されてしまうというリスクと、再起動毎に cron に仕込みなおさなければならない、というデメリットがある。再起動を気にせずスクリプトを実行したい場合は、次に説明する local.sh に仕込む必要がある。


local.sh は、ESXi 起動時に必ず実行されるスクリプトで、こちらにスクリプトの実行を仕込んでおけば、再起動後も継続して監視される。ただし、監視終了後に消し忘れてしまうと、延々と実行され続け、何らかの問題につながってしまう可能性もある。
本記事執筆にあたり、local.sh や cron を利用する方法は試験してないため、あくまでも理論のみの紹介である。 
cron や local.sh については以下の記事が参考になると思うので、もし実装を検討する場合は熟読したい。
 
 nohup や setsid で実行する方法は、通常の Linux などと同様なためここでは特に説明はしない。ただし、ESXi の場合は単純に nohup や setsid でスクリプトを実行しただけではうまく動作しなかった。そのため、以下のように実行する必要があった。また、当然ながら、スクリプトファイルに実行権限を与える必要がある。

 

chmod 777 monitorLogFileAndInvokeAction.sh
# setsid nohup ./monitorLogFileAndInvokeAction.sh

 

 なぜ、このようにしないとうまくいかないのかは不明だがとりあえず上記のコマンドで SSH 切断後も動作を継続させることができた。暫時的に実行するにはこちらの手法が一番簡易なため、本記事ではこちらの手法を採用している。

 

 

動作テスト

バックグラウンドで実行した後は、動作をテストする必要がある。動作をテストするためには手動でトリガーとなるメッセージをログに記載すればよいので、echo "hogehogehoge" >> vmkernel.log などでログファイルに追記すればよい。
もしくは、vmkernel.log であれば以下のコマンドでもよいだろう。

 # vsish -e set /system/sysAlert "hogehogehoge"

あとはメールが届くのを確認すればよい。nohup で実行していた場合は、スクリプト実行時の出力が nohup.out に出力されるため、トラブルシューティングしやすい。

動作テストが終わったら、 ps -cC などで ProcessID を特定し、kill コマンドで kill しておこう。そうしないと再起動するまで延々とバックグラウンドでスクリプトが動き続けることになる。いうまでもなく、 cron や local.sh に仕込んだ場合はそちらの仕込みも消しておかなければならない。

コメント

このブログの人気の投稿

vSwitchにSTPが不要な理由

ESXi に DNS サーバを何個まで登録できるか

障害でVDSから切断されたVCSAの復旧方法