先日、ティントリユーザーであるアドウェイズ様の導入事例を公開しました。アドウェイズ様は2013年よりティントリを稼働しておりますが、最近ではTintri APIを使ってTintri VMstoreのパフォーマンスの可視化機能を拡張し、「どこでもティントリ」を実現する仕組みづくりに取り組まれていて、その活用法についても導入事例中で触れさせていただきました。

そして、このSlack botを活用して、モバイルからカンタンにティントリを管理する「どこでもティントリ」の使い方とソースコードを、株式会社アドウェイズ 伊藤様から公開していただいたので、ティントリブログにてご紹介させていただきます。

株式会社アドウェイズ
サービスデベロップメントグループ インフラストラクチャーDiv
チーフシステムエンジニア 伊藤 正之氏

Slack botでティントリのVMstoreを管理する

こんにちは、インフラの伊藤です。このところPythonでSlackのbotを作って遊んでいます。

先日ティントリジャパン様のイベントにて、弊社の導入事例に関して講演をさせていただきました。そんな中でティントリのAPIを使用してVMStoreの情報を取得・表示する、Slack botについてお話をさせていただいたのですが、このbotがあれば、

==例え休暇で海外にいても、SlackがあればVMStoreに何が起きているかがわかる。==

つまり「どこでもティントリ」が実現できます (でも休暇はしっかり休みましょう!)。

実はこのbotはPythonとREST API操作の練習のために作っていたのですが、意外と反響があったため、今回はこのbotについてお話しさせていただきます。

Slack botアカウントの作成

まず、Slack botのアカウントを作成しましょう。Bot Userに関してはBot Users | Slackを参照してください。Slackにログインした状態で「new bot user integration」からSlack bot用のアカウントを作成します。アカウント作成が完了したら「API Token」をメモしておいてください。

Slackbot環境の構築

今回、Pythonは2.7系を使用しています。

Python 2.7.12

またSlack botは、以下のPythonライブラリを使用しています。

lins05/Slackbot
※本原稿執筆時点ではバージョン「0.4.1」です。

導入はpipで行えます。

$ pip install slackbot

なお、SlackのBotといえばhubotを用いるのをよく見かけますが、

  • Pythonの練習をしたい。
  • 社内サーバ(PC)で稼働させたい。

などの理由から、あえてhubotではなく、Slackbotを使用しています。RTM(Real Time Messaging) APIを使用しているため、WebSocketを利用したイベント受信ができることや、プラグインで機能を拡張できるのが良いと思っています(このTintribotもSlackbotのプラグインとして動作するように作成しています)。

Slackbotを動かしてみる

任意の場所にSlack bot用のディレクトリを作成します。

次に"slackbot_settings.py"に設定を行います。「API_TOKEN」にSlack botアカウント作成時にメモしたコードを記述してください。

"slackbot_settings.py":

DEFAULT_REPLYにはコマンドが解釈できなかった場合の返事を書いておきます。続いて"run.py"にbotを起動するコードを記述します。最低限必要な記述は以下の通りです。

"run.py":

記述が終わったらSlackbotを起動してみましょう。

$ python run.py

正常に起動すれば、メンションの特定の言葉に反応したり、チャンネルに投稿された言葉に反応したりします(試しにSlack botに’hello’と呼びかけてみてください)。詳しくはSlackbotの"README.md"を参照してください。

Tintribot環境の構築

Slackbotが無事に動作するようになったら、VMstoreを操作できるようにTintribotの環境を構築しましょう。

追加パッケージのインストール

Tintribotでは表示の整形のためにPrettyTableを使用しているため、もしインストールしていない場合はpipからインストールしてください。

$ pip install prettytable

Slackbotでプラグインを使えるようにする

利点でも述べましたが、Slackbotはプラグイン機能を持っています。このプラグイン機能を用いると、独自にDMや参加チャンネル内のメンション、キーワードに対して、反応する機能を実装することができます。

今回Tintribotはこのプラグインとして作成することで、Slackbot本来のコードを修正することなく機能を追加しています。また同様にプラグインを作成・追加することで、例えば1つのbotで、Tintri VMStoreとF5 BIG-IPの両方を操作することもできるようになります。

Slackbotでプラグインを利用するためには、まずbot用のディレクトリにプラグイン用のディレクトリを作成します。

Slackbotのプラグインとして読み込ませるディレクトリは、モジュールでなければならないので"__init__.py"を作成します。これは存在さえすれば良いので空ファイルで構いません。次にプラグインがロードされるように"slackbot_settings.py"に以下の設定を記述します。

これでSlackbot起動時に、pluginsディレクトリ内のプラグインが読み込まれるようになります。

ティントリのライブラリの追加

実はティントリのAPIを操作するにあたり、ティントリ社のTintri/tintri-api-examplesから、"tintri_1_1.py"を使用させていただいています。この"tintri_1_1.py"は、VMStoreへのログインやTintri APIへのPOSTなどを良い感じにサポートしてくれるライブラリとなっています。利用方法などはTintri/tintri-api-examplesのそのほかのコードを見るとよくわかるかと思います(このTintriBotも同じようなことしかしていませんが…)。そのため、先ほど作成したpluginsディレクトリ内に、"tintri_1_1.py"をコピーしておきます。

Tintribotプラグインファイルの追加

TintribotはSlackbotのプラグインとして動作するよう作成されているため、Tintribotからファイルを入手して、"tintri_mention.py"と"tintri_operation_v1.py"を"tintri_1_1.py"をpluginsディレクトリにコピーしてください。

またTintribotはSlackbotの"slackbot_settings.py"等を含めたファイルが入っているので、全体を任意の場所にコピーすることで、API_TOKEN等の設定のみで動作するようになっています。ただし、この場合Slackbotの起動は"run.py"ではなく"Tintribot.py"になるのでご注意ください。

Tintribotの動作に最低限必要なファイル/ディレクトリ構成は以下のようになります。

Tintribotの設定

Tintribotの起動に必要な各種設定を行います。必要なのはお手持ちのVMstoreのホスト名やIP、ログインのためのIDとパスワードです。複数台の管理にも対応していますので、Tintribotで管理したい全てのVMStoreの情報を用意してください。

pluginsディレクトリ内の"tintri_operation_v1.py"で45行目ぐらいに以下の記述があり、こちらにお手持ちのVMstoreの情報を列挙して記述してください。

書式は以下のようになります。

vmstores['VMStore名'] = ('VMStoreのIPもしくはホスト名(名前解決している場合)', 'VMStoreのユーザ名', 'VMStoreのパスワード')

VMStoreが複数台の場合は行を増やして記述してください(本当は別ファイルで管理したいところですが、今回はとりあえずということで…)。

Tintribotを動かしてみる

ここまでで問題がなければSlackbotを起動してみましょう。

$ python run.py(もしくはTintribot.py)

Slackbotに対してダイレクトメッセージで、以下のように呼びかけてみてください。

help

正常に動作すれば以下のようなヘルプが表示されます。

もしDEFAULT_REPLYで設定したメッセージが表示された場合、呼びかけたコマンドを確認してみてください。またPythonのエラーが表示された場合は、もう一度環境や設定を確認してみてください。

Tintribotはメンションに対して反応するようになっています。そのためTintribotを呼び出す場合は、メッセージの先頭に@botname[Slack botアカウント作成時に設定したbotの名前]: を記述します。ただしダイレクトメッセージで呼び出した場合は必要ありません。

またメッセージ本体の先頭には、必ず"tintri[半角スペース]"と指定します。これはTintribotにVMStoreの操作を行うことを伝えるために、あえて付けるようにしています。誤操作を防ぐ目的でもありますが…。

次に操作対象のTintri VMStoreを指定します。こちらは"vmstoresで記述したVMStore名"となります。

最後に実際の操作コマンドを指定します。現在のところ情報を取得するshowコマンドしかありませんが、例えば、

  • VMにPinを設定(Set)
  • スナップショットを作成(create)

などでこちらのコマンドが増えるかもしれません。

このように、例えば、

  • botの名前:tintribot
  • 使用しているVMstoreの名前:tintri-001

で情報を取得するには、

@tintribot:tintri tintri-001 show [appliance_info, dashboard, alert, vmlist]

となります。このあとの例では、上記の環境と想定してコマンドを入力していきます。