Last active
August 1, 2023 06:22
-
-
Save unchama/44dbcb21f4545c18993acce8c919c21e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# cronを使って任意の間隔で実行させてください | |
######################## | |
# 定数定義 | |
######################## | |
# 監視対象IPリスト(1行1IPで記載) | |
readonly MAIN_TARGET_IP_LIST=`cat << EOS | |
192.168.0.1 | |
192.168.0.2 | |
EOS | |
` | |
# バックアップIP使用の閾値 | |
# MAIN_TARGET_IP_LISTで疎通が取れたIP数がここで指定した閾値"以下"になったら | |
# BACKUP_TARGET_IP_LISTもGSLBへ登録するようにします | |
readonly USE_BACKUP_THRESHOLD=1 | |
# バックアップ対象IPリスト(1行1IPで記載) | |
readonly BACKUP_TARGET_IP_LIST=`cat << EOS | |
192.168.0.4 | |
192.168.0.5 | |
EOS | |
` | |
# ステータス判断保存用の一時ファイルのパスを指定 | |
readonly SAVE_STATUS_PATH="./updateGSLB.log" | |
######################## | |
# 変数定義 | |
######################## | |
## TODO 以下規約にそって小文字にしたい | |
## https://qiita.com/mashumashu/items/f5b5ff62fef8af0859c5 | |
# ping疎通結果格納変数(discord通知用) | |
NOTIFY="" | |
# ping疎通が取れたIPアドレスの配列 | |
OKLIST=() | |
# さくらのクラウドAPIに送信するJSONのServer部分 | |
OKJSON="" | |
# さくらのクラウドAPIに送信するJSONの全体 | |
JSON="" | |
# バックアップIPを使用するかどうかのフラグ | |
# 0=false,1=true | |
USEBKUPFLG=0 | |
# 通知可否判断用変数 | |
# 0=false,1=true | |
NOTIFYFLG=0 | |
######################## | |
# メイン処理 | |
######################## | |
######################## | |
# Step1: 死活状況確認 | |
######################## | |
# MAIN_TARGET_IP_LIST内で疎通が取れたサーバをOKLISTに追加 | |
# 7サーバ以上は登録しない(さくらのGSLBの制約) | |
while read line | |
do | |
ping -c 1 $line >> /dev/null | |
if [ $? -eq 0 ] ; then | |
echo "ping up -> $line" | |
NOTIFY="$NOTIFY""ping up -> $line \\n" | |
if [ ${#OKLIST[@]} -lt 6 ] ; then | |
OKLIST+=($line) | |
fi | |
else | |
echo "ping down -> $line" | |
NOTIFY="$NOTIFY""ping down -> $line \\n" | |
NOTIFYFLG=$((++NOTIFYFLG)) | |
fi | |
done <<END | |
$MAIN_TARGET_IP_LIST | |
END | |
# 疎通が取れたサーバー数が閾値未満かどうかを判定 | |
USEBKUPFLG=0 | |
if [ ${#OKLIST[@]} -lt $USE_BACKUP_THRESHOLD ] ; then | |
NOTIFY="$NOTIFY""*use bkup srv\\n" | |
USEBKUPFLG=$((++USEBKUPFLG)) | |
else | |
NOTIFY="$NOTIFY""*only check bkup srv\\n" | |
fi | |
# BACKUP_TARGET_IP_LIST内で疎通が取れたサーバをOKLISTに追加 | |
# (USEBKUPFLGが0の時は疎通確認結果のみ出力し、OKLISTへの追加はしない) | |
# 7サーバ以上は登録しない(さくらのGSLBの制約) | |
while read line | |
do | |
ping -c 1 $line >> /dev/null | |
if [ $? -eq 0 ] ; then | |
echo "ping up -> $line" | |
NOTIFY="$NOTIFY""ping up -> $line \\n" | |
if [ ${#OKLIST[@]} -lt 6 ] && [ ${USEBKUPFLG} -gt 0 ] ; then | |
OKLIST+=($line) | |
fi | |
else | |
echo "ping down -> $line" | |
NOTIFY="$NOTIFY""ping down -> $line \\n" | |
NOTIFYFLG=$((++NOTIFYFLG)) | |
fi | |
done <<END | |
$BACKUP_TARGET_IP_LIST | |
END | |
echo --- | |
echo "GSLBに登録されるサーバの一覧" | |
echo ${OKLIST[@]} | |
echo --- | |
echo "GSLBに登録されるサーバの数" | |
echo ${#OKLIST[@]} | |
echo --- | |
########################### | |
# Step2: Request用json生成 | |
########################### | |
# OKJSONを作成 | |
for i in ${OKLIST[@]} | |
do | |
OKJSON=`echo $OKJSON``cat << EOS | |
{ | |
"IPAddress": "$i", | |
"Enabled": "True" | |
}, | |
EOS | |
` | |
done | |
# さくらのクラウドへ送信するJSONを作成 | |
JSON=`cat << EOS | |
{ | |
"CommonServiceItem": { | |
"Settings": { | |
"GSLB": { | |
"DelayLoop": 10, | |
"HealthCheck": { | |
"Protocol": "ping" | |
}, | |
"Weighted": "True", | |
"Servers": [ | |
${OKJSON%?} | |
] | |
} | |
} | |
} | |
} | |
EOS | |
` | |
echo --- | |
echo "作成したリクエスト" | |
echo $JSON | |
echo --- | |
################################### | |
# Step3: さくらのクラウドAPIへ送信 | |
################################### | |
NOTIFY="$NOTIFY""updateGSLB result -> " | |
# 作成したJSONをさくらのクラウドAPIへ送信(部分要編集) | |
# https://developer.sakura.ad.jp/cloud/api/1.1/ | |
NOTIFY="$NOTIFY"`curl -f -o /dev/null -w "status %{http_code}, total %{time_total} sec" \ | |
-u "please_insert_access_token":"please_insert_access_roken_secret" \ | |
-X PUT -d "$JSON" https://secure.sakura.ad.jp/cloud/zone/is1b/api/cloud/1.1/commonserviceitem/please_insert_gslb_appliance_id`"\\n" | |
# curlのエラー拾う | |
if [ $? -gt 0 ]; then | |
NOTIFYFLG=$((++NOTIFYFLG)) | |
fi | |
###################################################### | |
# Step4: 実行結果のDiscord通知(通知要否判断も添えて) | |
###################################################### | |
# NOTIFYFLGの値で通知出すかどうか判定 | |
FINALFLG=0 | |
ZENKAIFLG=`cat $SAVE_STATUS_PATH` | |
if [ ${ZENKAIFLG} -eq 0 ] && [ ${NOTIFYFLG} -ge 1 ] ; then # 前回値0、今回値1以上 | |
# 通知する | |
NOTIFY="$NOTIFY""*検知ステータス移行(正常->異常)\\n" | |
FINALFLG=$((++FINALFLG)) | |
elif [ ${ZENKAIFLG} -ge 1 ] && [ ${NOTIFYFLG} -eq 0 ] ; then # 前回値1以上、今回値0 | |
# 通知する | |
NOTIFY="$NOTIFY""*検知ステータス移行(異常->正常)\\n" | |
FINALFLG=$((++FINALFLG)) | |
elif [ ${NOTIFYFLG} -ge 1 ] ; then # 今回値1以上 | |
# 通知する | |
NOTIFY="$NOTIFY""*検知ステータス(異常)\\n" | |
FINALFLG=$((++FINALFLG)) | |
else | |
# 通知しない | |
echo "" | |
fi | |
# 標準出力にMSGをだしておく | |
echo $MSG | |
# FINALFLGが1以上ならDiscordに通知を出す | |
if [ ${FINALFLG} -gt 0 ] ; then | |
# 結果をdiscord通知 | |
HEADER="[ `date` / `hostname` ]" | |
MSG=$NOTIFY | |
curl https://discordapp.com/api/webhooks/ここはwebhookをURLをぶちこむ \ | |
-X POST -H "Content-Type: application/json" -d "{\"content\": \"$HEADER\\n$MSG\"}" | |
fi | |
# 今回のNOTIFYFLGを保存(次回実行時の通知可否判断に使う) | |
echo ${NOTIFYFLG} > $SAVE_STATUS_PATH | |
echo "" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment