前回までの死活監視スクリプトでは、指定したサイトが正常に稼働しているかどうかをチェックし、異常時にメールやChatworkで通知を行っていました。今回は、このスクリプトに メール通知のフラグ を追加し、多次元配列風にサイト情報を管理 するように改修しました。これにより、サイトごとに通知の有無を設定できるようになり、コードもより管理しやすくなっています。
追加した新機能
- メール通知のフラグ
各サイトごとに、メール通知を行うかどうかを決めるフラグを追加しました。このフラグをtrue
に設定するとメールが送信され、false
の場合にはメール通知が行われません。これにより、必要なサイトのみメール通知が可能になります。 - 多次元配列風のデータ構造
Bashではネイティブな多次元配列はサポートされていませんが、連想配列のキーに工夫を加えることで擬似的に多次元配列を実現しました。各サイトのデータ(URL、メールアドレス、通知フラグ)をまとめて管理できるようになり、コードの見通しが良くなります。
改修後の設定ファイル構成
新しい設定方法では、サイト情報を多次元配列風にまとめています。以下の例では、サイト名を site_key
として使い、各サイトのURL、メールアドレス、通知フラグを格納しています。
# サイト情報の宣言
# 各サイトの設定
site_key="exampleSite1"
sites["$site_key.url"]="https://example1.com/"
sites["$site_key.email"]="contact1@example.com"
sites["$site_key.notify"]="true"
site_key="exampleSite2"
sites["$site_key.url"]="https://example2.com/"
sites["$site_key.email"]="contact2@example.com"
sites["$site_key.notify"]="false"
改修後のスクリプト
以下が、新しい設定を反映した死活監視スクリプトのコードです。
#!/bin/bash
# パラメーターで指定された会社名を取得
company="$1"
# 配列の宣言
declare -A sites
# 設定ファイルのパスを作成
config_file="$(dirname "$0")/config_${company}.sh"
# 設定ファイルが存在するかチェック
if [[ ! -f "$config_file" ]]; then
echo "エラー: 設定ファイル '${config_file}' が見つかりません。"
exit 1
fi
# 設定ファイルの読み込み
source "$config_file"
# 実行開始時間の取得
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"
alert_needed=false # 異常検知のフラグ
alert_summary_body="【サイト監視異常通知】\n\n日時: $start_time\n\n異常検知されたサイト:\n\n"
# サイトの死活監視
declare -A processed
for key in "${!sites[@]}"; do
# site_keyをキーから抽出
site_key="${key%%.*}"
# 同じサイトを一度だけ処理
if [[ -z "${processed[$site_key]}" ]]; then
url="${sites[$site_key.url]}"
emails="${sites[$site_key.email]}"
email_notify="${sites[$site_key.notify]}"
processed[$site_key]=1 # 処理済みマークを設定
# curlを使ってサイトのHTTPステータスコードを取得
status_code=$(curl -o /dev/null -s -w "%{http_code}" "$url")
# ステータスコードによる通知内容の判断
if [[ "$status_code" == "200" || "$status_code" == "301" || "$status_code" == "302" ]]; then
status_message="正常に稼働中"
# 正常時の通知
if [[ "$email_notify" == "true" && -n "$emails" ]]; then
send_email "$url" "$emails" "$status_code" "$status_message"
fi
else
# 異常時の通知メッセージを設定
if [[ "$status_code" == "503" ]]; then
status_message="サービスが一時的に利用できません"
else
status_message="ダウンしています"
fi
# メール通知の条件確認
if [[ "$email_notify" == "true" && -n "$emails" ]]; then
send_email "$url" "$emails" "$status_code" "$status_message"
fi
alert_needed=true
alert_summary_body+="$url\n 状態: $status_message\n ステータスコード: $status_code\n\n"
fi
# サマリーの内容を追加
summary_body+="$url\n 状態: $status_message\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"
# 異常が検知された場合、追加のChatworkとメール通知を実行
if [ "$alert_needed" = true ]; then
# 異常通知の送信 (メール)
echo -e "$alert_summary_body" | mail -s "【サイト監視異常通知】異常が検知されました" "$alert_email"
# 異常通知の送信 (Chatwork)
encoded_alert_summary_body=$(echo -e "$alert_summary_body" | sed ':a;N;$!ba;s/\n/%0A/g')
curl -X POST -H "X-ChatWorkToken: $chatwork_api_token" \
-d "body=$encoded_alert_summary_body" \
"https://api.chatwork.com/v2/rooms/$alert_chatwork_room_id/messages"
fi
スクリプトの動作確認
改修したスクリプトは、以下の流れで動作します。
- サイトの死活監視を行い、HTTPステータスコードを確認。
- 各サイトの通知フラグを確認し、通知フラグが
true
かつメールアドレスが設定されている場合のみ、異常時にメール通知を実行。 - サマリー通知は、個別の通知設定に関係なく、すべてのサイトの状況をまとめてメールとChatworkに送信。
まとめ
今回の改修によって、各サイトごとにメール通知の有無を設定できるようになり、必要なサイトのみ通知を行う柔軟な構成が実現しました。また、サイト情報を多次元配列風に管理することで、スクリプトの可読性と管理性も向上しています。
コメント