ことのはじまり
自宅の中のサーバ群は Zabbix を使って監視しており、メールを送信することで、アラートを検知する様にしています。
が、自宅と対外とのネットワークが落ちたときに、アラートメールが届かず、障害が発生していることが分からなかったという事案がありました。
そこで、外から簡単な自宅への監視をしようと決意。
とにかく簡単に収めようと頑張りました。
既存環境
- CentOS 7
- Owncloud
- WebServer
- ...etc
- アニメサーバ(許可された場所のみ閲覧可)
構築
今回のゴール
今回は、以下の条件をみたすものを作ります
- 自宅で公開している アニメサーバ (Web) を監視
- できる限り簡単に。
- アラートはgmailに飛ばすように。
- Slackも検討しましたが今回はメールで
とにかく、 簡単 がキーワードです
構築するもの
- クラウド上のインスタンス
- curl (標準)
- mailx
- 簡単なスクリプト
私の場合は、クラウドはさくらのクラウドを使用しました。
AWS EC2 でもいいと思います。(私は使ったことが無いのでなんとも言えませんが)
ほかは気合と根性で。
やったこと
- CentOS 入りのインスタンスの起動
- 各種初期設定
- mailx のインストール
- スクリプトの作成
実作業
ほぼあやふやな記憶ですが…(ほぼ覚えてない感じなので間違えてたらすいません)
CentOS7 インスタンスの起動
使用するクラウドサービスによって作業が異なるので、実際の作業は省略。
当方は、CentOS7 系のインスタンスを雑に1台立てました。
各種初期設定
人によってここも変わると思うので、ざっくりと。
SSH設定
パッケージ入れたり(元々入ってた気がする)、鍵入れたり(必要に応じて)します。
手抜きした私は、パスワード認証で頑張ります
SELinux の無効化
伝説のあれ。
今回は別にいらないと思うのですが、一応。
setenforce 0
sudo vim /etc/selinux/config
( config内 )
SELINUX=enforcing
↓
SELINUX=disabled
参考 : http://rfs.jp/server/security/selinux01.html
Firewall設定
CentOS7 なので、firewall-cmd
です。
今回は、SSHだけ空いていればOKなので、
sudo firewall-cmd --add-service=ssh
sudo firewall-cmd --add-service=ssh --permanent
的なコマンドを打ち込めばおk(ちなみに、さくらのクラウドの場合は最初から空いていた気が)
mailx のインストール
CentOS7 の場合は、mailx のパッケージをインストールして使用するとmailコマンドの代わりをするらしい
sudo yum install mailx
インストール後、mailx コマンドで、メールを送信することが可能になる
echo "本文" | mailx -s "件名" 宛先@メアド
スクリプト作成
今回の監視対象はこんな感じ
- Web監視
- 200 番とそれ以外を判定
- 1分間に1回監視
- アラート検知時にメール発砲
- 問題発生
- 修復
上記を満たすには、次の様にする
- Web 監視 : Curl で読み取り
- 1分間に1回 : crontab で対応
- アラート時にメール発砲 : スクリプト作成
というわけで、本稿ではスクリプトの作成をする。
スクリプトとして欲しい機能
- Curlの取得結果 + 日付
- アラートの判定
- メールの送信
至ってシンプル。簡単 is ベスト
今回作ったスクリプト
LANG=ja_JP.utf8
CURL_DATA=`curl --connect-timeout 30 -vvvv http://<your.website.url> 2>&1 `
IF_DATA=`echo $CURL_DATA | grep "HTTP/1.1 200 OK"`
SENDER=`cat mail_flag`
DATE=`date +"%Y/%m/%d %H:%M:%S"`
if [ -n "$IF_DATA" ]; then
if [ "$SENDER" = "2" ]; then
echo -e "$DATE\n$CURL_DATA" | col -b | mailx -s 'Recovery' <send_alart@mail.address>
SENDER=1
fi
else
if [ "$SENDER" = "1" ]; then
echo -e "$DATE\n$CURL_DATA" | col -b | mailx -s 'Problem' <send_alart@mail.address>
SENDER=2
fi
fi
echo $SENDER > mail_flag
gist : https://gist.github.com/kayo-tozaki/2d81be1ae23bf564e5b13efd3e4bab03
もっといいやり方があったと思いますが、
私が今できるのはこれまでなので…(汗
スクリプト作った上で困った部分
幾つか困った気がするので。
gmailでアラートが受け取れない
私の場合、メールの送り先はGmailにしていましたが、
最初はメールが受信できていないように見受けられました。
結果としては、迷惑メールフォルダに格納されてたっていうオチ。
届かないと思った場合は 迷惑メールフォルダ をチェック。
gmailで "noname" ってファイルが添付されてる
元々、メールの本文に、エラーの状況を載せようと思ったのですが、
当初の設計では、下記のようなメールが届きました。
このように、 "noname" というメールが届いていました。
対策としては、スクリプト内にある、次の2つが有効でした。
LANG=ja_JP.utf8
echo "本文" | col -b | mailx ...
curl のタイムアウト時間の調整
1分間に1回なので、時間の調整をしないと、アラートが鳴り止まないと言うか、
スクリプトがバグる可能性があるので、タイムアウトの時間を明示的に設定します。
やり方は、下記の通り。
curl --connect-timeout 秒数
デプロイ
Crontab で1分間で1回を実現する
たくさんの先人の知恵があるのですが…
crontab -e
*/1 * * * * コマンド
分のところを */1
とするといい感じです。
たくさんの先人の知恵、素晴らしい。
以上、完成。
実際に送られてくるメールはこちら。
誰かのご参考までに。