Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save unchama/44dbcb21f4545c18993acce8c919c21e to your computer and use it in GitHub Desktop.
Save unchama/44dbcb21f4545c18993acce8c919c21e to your computer and use it in GitHub Desktop.
#!/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