サーバからslackへ通知する

2回目の登場のあすてるです。 サーバ上で叩いたコマンドっていつ終わるかわからないものがありますよね? それらを完了したらslackで通知させようと思った話です。

slackでの設定

incoming hookを使用します。 https://my.slack.com/services/new/incoming-webhook にアクセスします

今回はランダムに送る程で Choose a channek... で #randam を選択して 下のAdd Incomingg WebHooks inteagration を押して進みます。

Webhook URLというものが出てくるのでこれをメモしておきましょう。 例として下記がでてきたとします。 https://hooks.slack.com/services/T0hogehoge/B0piyopiyo/HogePiyofooooooooooo

一番下の Save Settings を押して保存します。 これでslack上での作業は終了です。

サーバでの設定

ここからはサーバ上での操作です。 適当な場所にスクリプトを置きます。

#!/bin/bash
url='https://hooks.slack.com/services/T0hogehoge/B0piyopiyo/HogePiyofooooooooooo'
username='end_command'

to="$1"
message="$2"
emoji=':end:'

payload="payload={\"channel\": \"${to}\", \"username\": \"${username}\", \"text\": \"${message}\", \"icon_emoji\": \"${emoji}\"}"
curl -m 5 --data-urlencode "${payload}" $url

urlには先ほどメモしたWebhook URLを入れてください。 chmod 755 などして実行権限をつけておくと良いでしょう。

やってみる

第1引数にuser名かChannel名をいれて第2引数に通知したいコメントを入力します。 例

$ ./slack.sh "@astel" "test-message"
ok%
$ ./slack.sh "#random" "test-message"
ok%

okと表示され、メッセージが届いていることが確認できました。 aliasなどで設定しておくと便利かもしれません。

実際は&&で渡して使用します。

おわりに

簡単にセットアップできました。 userのアイコンを今回は:end:にしましたが自分で設定して面白いものもつくれそうです。 zabbixの障害通知やcronでセットしてbotなどにも使えそうですね。 問題としてはそもそも通知する前にこけてしまった場合は && だと動かないのでそこらへんは考える必要がありそうです。