先日、ティントリユーザーであるアドウェイズ様の導入事例を公開しました。アドウェイズ様は2013年よりティントリを稼働しておりますが、最近ではTintri APIを使ってTintri VMstoreのパフォーマンスの可視化機能を拡張し、「どこでもティントリ」を実現する仕組みづくりに取り組まれていて、その活用法についても導入事例中で触れさせていただきました。
そして、このSlack botを活用して、モバイルからカンタンにティントリを管理する「どこでもティントリ」の使い方とソースコードを、株式会社アドウェイズ 伊藤様から公開していただいたので、ティントリブログにてご紹介させていただきます。
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アカウント作成時にメモしたコードを記述してください。
DEFAULT_REPLYにはコマンドが解釈できなかった場合の返事を書いておきます。続いて"run.py"にbotを起動するコードを記述します。最低限必要な記述は以下の通りです。
記述が終わったら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]
となります。このあとの例では、上記の環境と想定してコマンドを入力していきます。