Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
334
Help us understand the problem. What is going on with this article?
@tt2004d

[10分で出来る]シェルスクリプトの結果をslackに投稿

More than 5 years have passed since last update.

はじめに

slack便利ですよね。仕事柄、何かを監視しつつチャットで話すということをよくおこなっているので、監視の結果を別画面ではなくてslackで表示できたら便利だよねという話になりました。やってみると簡単でしたので、こちらで手順を説明します。

サンプルとしてwコマンドの結果をslackに送ってみます。

手順としては大きく二つ、Incoming WebHooksの登録と、シェルの作成になります。シェルはサンプルを用意したのでそちらをちょっと書き換えるだけで動きます。Mac上で試しましたが、Linuxでも動くとおもいます。
とういことで以下、手順です。

Incoming WebHooksの登録

slackにログインします。
名前の右側のボタン(?)をクリックして「Configure Integrations」を選択します。

ConfigureIntegration.png

一覧が沢山でてきますが、「Incoming WebHooks」を選択します。ブラウザの検索を使うと便利です。「Incoming WebHooks」は、指定されたURLにメッセージを送るとslack上にそのメッセージが表示されるという機能です。

右側の「+Add」ボタンをクリックします。
IncomingWebhooks.png

デフォルトの投稿チャンネルを選択します。Incoming WebHooks に引数をあたえることで投稿チャンネルは変更できます。個人的にはテスト等のチャンネルをつくっておいて、設定することをお勧めしますが、この例では#generalを設定しています。設定後、「Add Incoming Webhooks Integration」ボタンが有効になるのでクリックします

AddIWH.png

送信用のURLが表示されます。設定もいろいろできるのですが、10分でできると書いている関係上、URLをメモするだけにします。ちなみにIncoming Webhookss Integrationは、パスワード認証とかないので、このURLさえあれば、誰でも投稿できる点注意が必要です。そのため画像ではモザイクにしています。

URL.png

シェルスクリプトの実行

送信用のURLも手にいれましたので、スクリプトの時間です。

bash

#!/bin/sh

set -eu

#Incoming WebHooksのURL
WEBHOOKURL="ここにIncoming Webhooks IntegrationのURLをいれてね"
#メッセージを保存する一時ファイル
MESSAGEFILE=$(mktemp -t webhooks)
trap "
rm ${MESSAGEFILE}
" 0

usage_exit() {
    echo "Usage: $0 [-m message] [-c channel] [-i icon] [-n botname]" 1>&2
    exit 0
}

while getopts c:i:n:m: opts
do
    case $opts in
        c)
            CHANNEL=$OPTARG
            ;;
        i)
            FACEICON=$OPTARG
            ;;
        n)
            BOTNAME=$OPTARG
            ;;
        m)
            MESSAGE=$OPTARG"\n"
            ;;
        \?)
            usage_exit
            ;;
    esac
done
#slack 送信チャンネル
CHANNEL=${CHANNEL:-"#general"}
#slack 送信名
BOTNAME=${BOTNAME:-"mybot"}
#slack アイコン
FACEICON=${FACEICON:-":ghost:"}
#見出しとなるようなメッセージ
MESSAGE=${MESSAGE:-""}

if [ -p /dev/stdin ] ; then
    #改行コードをslack用に変換
    cat - | tr '\n' '\\' | sed 's/\\/\\n/g'  > ${MESSAGEFILE}
else
    echo "nothing stdin"
    exit 1
fi

WEBMESSAGE='```'`cat ${MESSAGEFILE}`'```'

#Incoming WebHooks送信
curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"icon_emoji\": \"${FACEICON}\", \"text\": \"${MESSAGE}${WEBMESSAGE}\" }" ${WEBHOOKURL} >/dev/null

WEBhooksURLの変数にさきほど記録したURlを設定し、webhooks.shとして保存して、実行権限をあたえます。
使い方は簡単標準入力に送信したいメッセージを送るだけです。

$ echo test1 | ./webhooks.sh

とすると
スクリーンショット 2015-03-20 17.31.08.png

$ w | ./webhooks.sh

であれば
スクリーンショット 2015-03-20 17.31.19.png

と送信できました。

おわりに

駆け足でシェルスクリプトからslackにメッセージを送信する方法を説明しました。 注意点としては

  • 改行をslack用に¥nに変換していますが、¥に変換した後¥nにしているので、文字列中に¥があると改行がおかしく表示されるとおもいます。
  • #generalは誰もがみるチャンネルなのでテスト用に自分のチャンネルをつくるかbotから直接自分にメッセージをくるようにしてテストしたほうがよいです。
  • URLの取り扱いにはご注意を(設定画面で削除することはできます)。

cronと組み合わせて定時報告させるととても便利です。また、スクリプトをみてもらえるとわかりますが、アイコン等も簡単に変更できますので、ある閾値を越えたら怒ったJenkinsが通知というような事もできますね。

ではでは。

334
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
tt2004d
AWSの構築の仕事をしています。
cloudpack
Amazon Web Services (AWS) の導入設計、環境構築、運用・保守をサポートするマネジドホスティングサービス

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
334
Help us understand the problem. What is going on with this article?