Slack API を用いた容量監視
概要
awxサーバの容量がひっ迫してサーバがダウンする事象が発生していたため、 毎週月曜日に容量を取得しSlackに投稿するボットを作りました
手順
結果
1. slack apiのenableとスレッド指定
※下記を参考に設定
https://api.slack.com/messaging/webhooks#getting_started
2. slack webhook urlの取得
1の設定後に下記のようなwebhook urlを取得できる
https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXX
3. python スクリプトの作成
2で取得したwebhook url宛にリクエスト(post)を投げるスクリプトを作成。
ルートディレクトリの容量はsubprocessモジュールを使用して取得。
※dataの書き方は少し独特なので、もしトラブった場合は以下を参照。
formatを使用した文字列内で波括弧({)を使用する
import requests import subprocess, sys import socket def create_message(): hostname = socket.gethostname() cap = subprocess.run('df -h /', shell=True, encoding='utf-8', stdout=subprocess.PIPE, stderr=subprocess.STDOUT) if cap.returncode != 0: cap_msg = "error" else: cap_msg = cap.stdout message = f"[{hostname}]\n {cap_msg}" return message def post_message(message): headers = { "Content-type": "application/json" } data = f'{{"text":"{message}"}}' response = requests.post('https://hooks.slack.com/services/XXXXXXX', headers=headers, data=data) # 2で取得したwebhook urlを指定 def main(): message = create_message() post_message(message) if __name__ == '__main__': main()
実際にSlackに送られたメッセージ
[centos7] Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 104G 22G 82G 21% /
curlでもテスト
curl -i -H "Content-type: application/json" -s -S -X POST -d '{"text":"test"}' https://hooks.slack.com/services/XXXXXX
問題なく「test」というメッセージが送られてきました。
4. cronの設定
毎週月曜日に容量を確認
$crontab -e
0 9 * * 1 python /root/slackapp/post_message_to_slack.py
参照
https://qiita.com/momotaro98/items/fe567041cbd2bd3f2281 https://api.slack.com/messaging/webhooks#getting_started