Slack API を用いた容量監視

概要

awxサーバの容量がひっ迫してサーバがダウンする事象が発生していたため、 毎週月曜日に容量を取得しSlackに投稿するボットを作りました

手順

  1. slack apiのenableとスレッド指定
  2. slack webhook urlの取得
  3. python スクリプトの作成
  4. cronの設定

結果

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