雑なA型によるクラウドとモバイルと運営と

大阪でInnovation EGGを運営している人のBLOGです。時々更新します〜

【cloudpack 大阪 BLOG】MSPのシステム化について(不定期連載) Hubotに定期的につぶやかせる&作業の管理をさせる

 

JAWS DAYS2015でマクロスを使ったLTしたら

なんて記事が出ていて、時代の先を行っているな俺とかわけのわからん優越感に

浸っていますw

 

今回は<Hubotに日次作業を定期的につぶやかせる&作業の管理をさせる>です

f:id:unioce:20150328104852p:plain

 

 

①と②のやり取りの部分は前回で基本は出来るようになります•

そしてよくHubotの最初に実装されている機能で、Slackにpingと入力したらpongと

返したりするのを少し楽しみますが・・・これからどう活用するの?で

PCの電源をそっとOFFにして、Heroku上には実装を待ち続ける、野良Hubotが

5万といるのではないかと推測されます・・・汗

 

とりあえず日次業務をつぶやかせるには、Hubotの機能だけでは無理なので

状態を管理する機能と、時間になったらHubotをつぶかす機能が必要になります。

 

今回状態を管理させるのは、Redisを使用し、

時間によるトリガーはnode.jsのモジュールである、cronモジュールを使います。

redisのインストールと設定は

sudo yum --enablerepo=epel install npm redis
sudo /etc/init.d/redis start
sudo chkconfig redis on

で、行いcronのインストールは

npm install cron

で、行いました。

これで下準備はOKでつぶやかせるには○の所に時間を入れて

cron = require('cron').CronJob
client = require("redis").createClient()

module.exports = (robot) ->

    new cron('0 0 ○ * * *', () ->
        robot.messageRoom つぶやかしたいルーム名, "MSPの皆様おはようございます。本日の日次処理担当の方、○時になりましたので日次処理の対応よろしくお願いします"
    , null, true, 'Asia/Tokyo').start()

 で出来て、redisへの値のセットは

client.set "○", 1

な感じで(○はキー名として時間で”1”はセットしたい値です)簡単に値のセットが可能です・・・が、hubotに対する指示(ここでは作業を着手した)を、毎回キーボードで

入力してって言ったら、間違いなく使ってくれない・・・と言う事で、

HubotがURLを表示して、クリックされたらHubotが受け付けてつぶやく事をやめるような、お手軽なUIの実装を行います。

Hubotはnode.jsなので

request = require 'request'

    module.exports = (robot) ->
        robot.router.get "/hubot/daily", (req, res) ->

な形で、WEBサーバーとしてURLを受け付ける事も可能ですが、

 SlackでURLを表示してしまうと、もれなくSlackのプレビュー機能で、

そのURLがコールされるというかなり残念な状況になってしまい、

表示=URLを叩かれた状態で処理が勝手に完了して、

全く無意味な状態になるので、コード上でユーザーエージェントを確認し

if req.headers['user-agent'] == 'Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots)'
    return

slackからのプレビュー表示なら、処理を抜けるような実装をしてあげる必要があります。

で後は

client.get "○",(err, val) ->
    if err
        return
    # エラーが無ければデータを取得
    if val == 1
        client.set "○", 0
        robot.messageRoom "ルーム名","*○時の日時処理の受付完了しました*"

な感じで、redisから値を取得して状態を見て、問題なければつぶやくような実装をすれば

f:id:unioce:20150327193420p:plain

な感じでつぶやいてくれるようになります。

 

なお今回の機能を実装するにあたり下記のページを参考にさせて頂きました

私のブログは実装側を目的としているのではなく、

課題に対するアプローチがメインなので、ざっくりとした形で抜粋させてもらっていますので、実装は色んなBLOGを参考にして頂ければと思います。

 

今回の実装の仕方は、Hubotが初めてでもあったのと、見たサンプルを元に

実装していったために、作りが固定で汎用性が無いものになっていますが

とりあえず24/365を目標にずっと稼働しているので、今のところは目的を果たしていますし、担当者が作業を忘れていても、Slackを見ている他の人が気がつくようになっています。

クリックしないと、10分おき(時間が遅くなると5分おき)につぶやくので、

Slack上でのやり取りを中断してしまう?って話もありましたが、

気がつけばすぐにクリックと、作業漏れや作業着手の遅れが可視化されたので、

とりあえずはよしかなと思っていますが、よりMSPや他のメンバーにわかりやすくできる案が頭の中では出来たので、いつのタイミングかで実装/投入したいと思います。

 

次回はこの機能の実装を汎用化させた、

googleカレンダーgoogle app scriptとhubotとslackの連携を書きます。