サーバのノードダウンをLINEで通知

外出先からiPhoneのホームアプリを使って暖房のスイッチを入れようとすると、homebridgeサーバが何らかの理由でダウンしている、なんてことがたまにあります。今はGoogle Home Miniを併用していて、IRKitがフリーズしていない限りそこまで困ることはありません。そのあたりの話はまた別のエントリで書くとして、Raspberry Piの話に戻ると、ウチの場合はhomebridgeサーバを自ら監視して、自分がネットワークに接続できていなければ再起動をかけるように設定しています。
この話は今回書こうと思っているお話と関係なくはないのですが、これまた別のお話。今回は、homebridgeサーバがダウンしていたら、別の監視用のRaspberry Pi ZeroからLINE通知が来るようにしました、というお話です。

1.LINEのアクセストークンを発行

最初、サーバがダウンしたらメールで通知が来るようにしようと思ったのですが、これだけの為にメールサーバを立てるのも、踏み台にされるリスクがあるし、運用に手を取られるのも現実的ではないでしょう。それに、今どき個人サーバのノードダウンでメールが来るなんて前時代的だしダサい…という勝手な思いもあり、スマホに通知が来る方向で考えました。
そんなこんなでサーバのノードダウンをLINEで通知する方法を検討し、下記のようになりました。

今回はこちらのサイトを参考にさせて頂きました。
www.tapun.net

まずはLINEのアクセストークンを発行します。
下記のサイトにアクセスして、使っているLINEのIDでログインします。
https://notify-bot.line.me/my/


右上のアカウント名から[マイページ]を開き、[トークンを発行する]をクリックします。
f:id:yrn7:20171215031633p:plain
f:id:yrn7:20171215031638p:plain
[トークン名を記入してください (通知の際に表示されます)]には適当に名前をつけ、[1:1でLINE Notifyから通知を受け取る]をクリックして[発行する]をクリックします。
これでトークンが発行されます。
このアクセストークンを監視用のシェルスクリプトに使用します。

2.シェルスクリプトの準備

ウチにはhomebridge用のRaspberry Pi以外にRaspberry Pi Zeroが二つあるので、その片方に下記のシェルスクリプトを仕込みました。
参考はこちらのサイトになります。
inamuu.com

任意の場所に下記のスクリプトを作るのですが、ぼくは /usr/local/bin/ に作成しました。

$ sudo vim /usr/local/bin/notify-serverdown.sh
#!/bin/bash

NUM01=3
IPLIST=“監視サーバのIPアドレスを記入。スペース区切りで複数指定可”

### PING check
for IPL in ${IPLIST}
do
   ping ${IPL} -c ${NUM01}
   if [ $? -eq 1 ];then
      if [ -e /tmp/pingfile${IPL}.tmp ];then
        echo "TMP file already exsists"
      else
         touch /tmp/pingfile${IPL}.tmp
         curl -XPOST -H 'Authorization: Bearer LINEのトークンを入力’ -F 'message=通知メッセージを記入’ https://notify-api.line.me/api/notify
      fi
   else
      rm -f /tmp/pingfile${IPL}.tmp
   fi
done

exit 0

保存したスクリプトの権限を変更します。

sudo chmod 744 /usr/local/bin/notify-serverdown.sh

監視先のサーバをシャットダウンするか、スクリプト内の指定を存在しないIPアドレスに変更してテストします。

$ sudo /usr/local/bin/notify-serverdown.sh

これでLINEに通知が来れば成功です。
f:id:yrn7:20171217185952j:plain

3.crontabへの登録

監視の為の ping にはroot権限が必要なので、crontabにrootで登録します。

$ sudo crontab -e

下記を追加。 ※毎時30分ごとに ping を行い、ノードダウンしていればLINEで通知する

*/30 * * * * /usr/local/bin/notify-serverdown.sh

対象のサーバをシャットダウンしておき、LINE通知が来るのが確認できれば設定は完了です。
お疲れ様でした。