サイト死活監視シェルスクリプトのChatwork対応版

前回の記事 こちら で、Bashスクリプト(シェルスクリプト)で作る簡易的なサイト監視スクリプトについて紹介しましたが、今回はさらに便利な機能を追加した進化版スクリプトをご紹介します。新たに追加したのは、サマリー通知機能Chatwork通知機能です。

ディレクトリ構成

今回のスクリプトでは、設定ファイルと実行ファイルを分けることで、監視対象の変更や通知設定の調整がしやすい構成にしています。以下がディレクトリ構成です。

site_monitor/
├── config.sh         # 設定ファイル (監視対象や通知先設定)
└── monitor.sh        # メインスクリプト (監視と通知を実行)
  • config.sh: 監視対象のサイトや通知先メールアドレス、ChatworkのAPI設定を記述します。
  • monitor.sh: config.sh の設定に基づいて監視を行い、結果をメールとChatworkで通知します。

追加された機能

サマリー通知

複数のサイトを監視する際、各サイトの状態をまとめて報告するサマリー通知機能を追加しました。これにより、個別通知に加え、すべてのサイトの状況を一目で確認できるため、運用の効率が向上します。

Chatworkへの通知

特定のChatworkルームに、監視結果を自動で通知する機能も加えました。これにより、メールだけでなくChatworkでも監視結果を共有でき、チーム内の情報共有がスムーズに行えます。

cronによる定期実行

サイトの監視を自動化するために、cronで定期的にスクリプトを実行する設定を行います。例えば、毎時監視する場合には、以下のcron設定を行います。

スクリプトの詳細

設定ファイルの準備

まず、監視対象サイトや通知先情報を設定するファイル config.sh を作成します。以下は、サンプル設定内容です。

# BCC用メールアドレス
bcc_email="example.bcc@gmail.com"

# Chatwork API設定
chatwork_api_token="YOUR_CHATWORK_API_TOKEN"
chatwork_room_id="123456789"

# 監視対象サイトの配列 (URL, 通知先メールアドレスの配列)
declare -A sites
sites["https://example1.com/"]="alert@example1.com"
sites["https://example2.com/"]="alert@example2.com"

メインスクリプトの設定

次に、監視スクリプト monitor.sh を作成し、config.sh の設定をもとに監視を実行します。以下は、スクリプト全体の内容です。

#!/bin/bash

# 設定ファイルの読み込み
source "$(dirname "$0")/config.sh"

# 実行開始時間の取得
start_time=$(date "+%Y-%m-%d %H:%M:%S")

# メール通知関数
send_email() {
    local site=$1
    local emails=$2
    local status_code=$3
    local status_message=$4
    local subject="【サイト監視】$site は$status_message (HTTPステータスコード: $status_code)"
    local body="【サイト監視結果】\n\n日時: $start_time\n\n対象サイト: $site\n状態: $status_message\nHTTPステータスコード: $status_code\n\nご確認ください。"

    # メール送信 (BCCに当社のメールアドレスを追加)
    echo -e "$body" | mail -s "$subject" -b "$bcc_email" "$emails"
}

# サマリー通知用の変数
summary_subject="【サイト監視サマリー】全サイトの状態レポート"
summary_body="【サイト監視結果サマリー】\n\n日時: $start_time\n\n監視結果:\n\n"

# サイトの死活監視
for site in "${!sites[@]}"; do
    emails="${sites[$site]}"

    # curlを使ってサイトのHTTPステータスコードを取得
    status_code=$(curl -o /dev/null -s -w "%{http_code}" "$site")

    # ステータスコードによる通知内容の判断
    if [[ "$status_code" == "200" || "$status_code" == "301" || "$status_code" == "302" ]]; then
        # 正常時の通知
        send_email "$site" "$emails" "$status_code" "正常に稼働中"
        summary_body+="$site\n  状態: 正常に稼働中\n  ステータスコード: $status_code\n\n"
    else
        # 異常時の通知
        send_email "$site" "$emails" "$status_code" "ダウンしています"
        summary_body+="$site\n  状態: ダウンしています\n  ステータスコード: $status_code\n\n"
    fi
done

# サマリー通知の送信 (メール)
echo -e "$summary_body" | mail -s "$summary_subject" -b "$bcc_email" "$bcc_email"

# サマリー通知の送信 (Chatwork)
encoded_summary_body=$(echo -e "$summary_body" | sed ':a;N;$!ba;s/\n/%0A/g')

curl -X POST -H "X-ChatWorkToken: $chatwork_api_token" \
    -d "body=$encoded_summary_body" \
    "https://api.chatwork.com/v2/rooms/$chatwork_room_id/messages"

cron設定での定期実行

スクリプトを定期的に実行するには、cronの設定を行います。以下は、1時間ごとにスクリプトを実行する設定例です。

  1. ターミナルで crontab -e を実行して、cron設定を開きます。
  2. 次の内容を追加し、スクリプトを毎時実行するように設定します。
0 * * * * /path/to/site_monitor/monitor.sh

/path/to/site_monitor/monitor.sh をスクリプトの実際のパスに置き換えてください。

まとめ

新しく追加したサマリー通知機能やChatwork通知機能により、複数サイトの監視結果が一目で確認できるようになりました。また、cronによる定期実行設定で、監視作業を完全に自動化できます。

コメント

タイトルとURLをコピーしました