Tech Sketch Bucket of Technical Chips by TIS Inc.

GitHubがOpsツールの中心として活用しているHubotを使ってみる~インストール、スクリプトの作成、Herokuへのデプロイ~

Pocket

Github社製のBotフレームワークであり、同社の運用の中心的なツールとして使われている「Hubot」をインストールし、独自のスクリプト作成、Herokuへのデプロイまでしてみます。

Hubotとは?

GitHub社が作成したオープンソースのBotフレームワークで、Botとは、自動的に実行、応答するようなプログラムのことを指します。HubotはNode.js、CoffeeScriptで作成されており、 HerokuなどのPaaSへのデプロイも容易 となっています。

Botなので、定期的、または自動的にプログラムを実行したり、問い合わせに応えるような機能を提供します。Hubotに最初から組み込まれているスクリプトでは画像の投稿や、地図の表示、計算などが行えるのですが、自身でスクリプトを追加することも可能です。

例えばGitHub社では、チャットアプリとHubotを繋げ、チャットルームにHubotのコマンドを投稿することで本番環境へのデプロイや、サーバリソースの確認、ビルドの実行、結果の確認など様々な運用タスクを実施しているようです。遠隔地で働いていたり、新規参画したメンバーでもチャットルームを見れば状況やコンテキストが理解出来たり、同じチャットルーム上でコマンドを実行しているので教育効果もあるのではないでしょうか。

hubot.png
http://hubot.github.com/

Hubotのインストール

まずはHubotをインストールしていきます。Hubotは前述した通り、Node.js、CoffeeScriptで作成されています。 Node.jsnpm についてはインストール済みであることを前提として進めていきます。また、データの永続化に Redis を利用します。RedisをインストールしていなくてもHubot自体は動きますが、Redisについてもインストール済みの前提で進めます。

HubotのインストールはGitHubからHubotをクローンしてインストールするか、直接npmでインストールすることが出来ます。

GitHubからクローンしてインストール

npmでインストール

Hubotの基本的なコマンドを試してみる

Hubotのインストールが完了していれば、hubotとターミナル上で実行すればHubotを起動できます。

helpを表示

Hubotのコマンドの実行は、以下のように大文字小文字を区別せず、@や:で区切っても呼び出せます。

ping

PINGと投稿するとPONGと返すだけのコマンドです。Botの"Hello World"的なものでしょうか?

math me

Hubotが計算し、結果を返してくれます。

pug me

パグの画像のURLを返します。

pugme.jpg

animate me

指定したキーワードで検索したGIF画像のURLを返します。

puppy.gif

ship it

Helpに ship it - Display a motivation squirrel と書いてあるとおり、リリースしなきゃ!って気分になりますね。

shipit.jpg

youtube me

指定したキーワードで検索したyoutubeの動画のURLを返します。

Hubotで独自コマンドを実行する

スクリプトファイルを追加することで新しいコマンドを定義することが出来ます。また、多くのスクリプトが カタログ として公開されていますので、覗いてみてください。

catalog.jpg

http://hubot-script-catalog.herokuapp.com/

自分用のHubotを作成する

スクリプトを作成する前に、自分用のHubotを作成しておきましょう。

作成したHubotを起動するには、作成したHubotのディレクトリに移動し、 bin/hubot を実行します。

Hubotに個別の名前を付けたい場合は呼び出し時に --name <名前> のオプションを指定します。

名前を付けると、今まで

と実行していたのが

と実行できるようになります。
愛着が持てるような名前にするのも良いかもしれませんね。

スクリプトを作成する

作成したスクリプトはhubot/scripts配下に置き、Hubotを起動することで読み込まれます。スクリプトはCoffeeScriptで作成しますが、JavaScriptでも作成、実行が可能です。
Hubotがコマンドを実行する主な3つのパターンについて、サンプルスクリプトを作成してみました。

  • 呼びかけに応える
  • チャット上の発言に反応する
  • 定期的に実行する
呼びかけに応える

Hubotに直接呼びかけてコマンドを実行したい場合は respond // を利用します。実行する際は、コマンドの前に hubot か、自分で付けたhubotの名前を入力します。
試しにFizzBuzzコマンドを追加するスクリプトを作成してみました。

実行すると以下のようになります。

チャット上の発言に反応する

hear // という形式で、正規表現にマッチした際に処理を行います。
以下のスクリプトは、チャット上に現れた"hello"という文字列に対しては"Hello!"と返し、"bye"という文字列に対しては"Bye!"と返しHubotを終了する処理が書かれています。正規表現のスラッシュの後の i は大文字小文字を区別しないようにする為の修飾子です。

実行すると以下のようになります。

定期的に処理を行う

定期的になにかを実行するといえば cron です。Node.jsの node-cron というライブラリを利用します。
node-cronはnpmでインストールしておきます。

以下は、朝9時になるとHubotが "朝会の時間です。" と教えてくれるようになるスクリプトです。

データ永続化

Hubotはデータの永続化にRedisを利用します。また、スクリプトからデータを取得、格納できる領域として robot.brain を公開しているので簡単に利用することができます。
以下は "tired"というキーワードに反応し、キーワードの出現回数を記憶、2回以下の場合は "Let's take a short break." 、3回以上の場合は "You must take a break."と応え、"fine"というキーワードが出た場合は"tired"が出た数を0にし、"Good."と応えます。

データが保存されていることを確かめるために、2回連続で "I'm tired."と入力した後にHubotを終了し、再度Hubotの起動後 "I'm tired."と入力してみます。

データが記憶されているので"You must take a break."と返ってきました。"I'm fine!"と入力すると"tired"の出現回数をクリアするため、"I'm tired."と入力しても"Let's take a short break."と返ってきます。

IRCやチャットアプリと接続する

Hubotは、CampfireやHipChat、TwitterやSkypeといったサービスとアダプターで繋ぐことで、そのサービス上でHubotのコマンドを実行することが出来ます。

アダプタの一覧は以下になります。

IRCで試してみる

IRC用のアダプタの hubot-irc を使い、freenodeの qwebirc に繋いでみます。

hubot-ircのインストール

チャットルームの情報を入力

qwebirc に接続し、ルーム情報を入力します。NicknameとChannelsは任意の値で構いません。

webchat-thumb-680x465-2172.jpg

チャットルームへの接続

以下のコマンドで接続します。HUBOT_IRC_ROOMSHUBOT_IRC_NICK は自身で設定した値に置き換えて実行してください。

チャット上に自身のアカウント(tenten)とHubot(myhubot)がいるのが確認できるかと思います。また、チャット上でHubotのコマンドを実行すると、応答が返ってくるのが確認できます。

hubot_chat-thumb-680x270-2194.png

ターミナルには以下のように表示されます。

hubot_console.png

Hipchatで試してみる

hipchat.png

GitHub社が行っているように、チャットアプリでも試してみます。今回は無料で5人まで利用できるAtlassianの‎ Hipchat を利用します。(GitHub社では37signalsの Campfire を利用しています) また、Hubotは Heroku で動かしてみます。

HipchatにHubot用のアカウントを登録する

Hipchatに自身のアカウントを追加し、利用出来る状態になったらHubot用のアカウントも合わせて追加しておきます。

hipchat_user_add.png

アダプタをインストールする

アダプタのインストールの前に、依存するライブラリをインストールしておきます。

  • OS Xにbrewでインストールする場合

  • Linuxにapt-getでインストールする場合

Hipchat用アダプタのインストールは、自身のHubotのディレクトリに移動し以下のコマンドを実行します。

次にProcfileにHipchat用のアダプタを利用する為の設定を記述します。

Herokuへのデプロイ

Hipchatのアダプタの設定が出来たのでHerokuにデプロイします。Herokuへのアカウント登録と、Herokuをコマンドラインから操作する為の "Heroku Toolbelt"https://toolbelt.herokuapp.com/ はインストール済みの前提で進めます。まずは作業していたHubotのディレクトリをGit管理下にし、変更内容をコミットします。

次にHerokuにアプリケーションを作成します。アプリケーション名は任意の名前か、指定しない場合はHerokuが素敵な?名前を付けてくれます。

Hubotがデータ永続化にRedisを使うので、アドオンとして Redis To Go を追加します。Redis To Goはnanoプランであれば無料で利用できます。

次にHerokuの環境変数を設定していきます。HUBOT_HIPCHAT_JID にはHubotアカウントのJIDを指定するので注意してください。アカウントのJIDは こちら から確認できます。HUBOT_HIPCHAT_ROOM にはHubotアカウントを参加させたいルーム名をカンマ区切りで指定します。ルーム名は こちら から確認できます。環境変数には、ルーム名の後ろにconf.hipchat.com というドメインを加えた値を指定してください。ルーム全てに参加させたい場合は"All"を指定します。

最後にHerokuにコードをpushし、Webプロセスを起動します。

起動に成功していれば、ルームにHubotのアカウントが入室している状態になっているはずです。今回はiPhoneにHipChatのアプリをインストールして試しました。

member_list.jpg

ターミナル上で実行していたコマンドも実行出来ました。返ってきたURLが画像として表示されるので楽しいです。

hipchat_chat.jpg

まとめ

今回は、Hubotのインストールからはじめ、独自のスクリプトを作成し、Herokuへデプロイしてチャットアプリから動作を確認するところまでやってみました。これだけだと面白いBotなだけなので、次回以降に外部サービスとの連携や、応用的な使い方を紹介したいと思います。

エンジニア採用中!私たちと一緒に働いてみませんか?