Slack botでTintriのVMstoreを管理する

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

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

Slack botでTintriのVMstoreを管理する

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

先日Tintri by DDN様のイベントにて、弊社の導入事例に関して講演をさせて頂きました。
そんな中でTintriのAPIを使用してVMstoreの情報を取得・表示するSlack botについてお話をさせて頂いたのですが、このbotがあれば、
==例え休暇で海外に居ても、SlackがあればVMstoreに何が起きているかがわかる。==
つまり「どこでもTintri」が実現できます。
(でも休暇はしっかり休みましょう!)

実はこの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用のディレクトリを作成します。

$ mkdir tintribot
$ cd tintribot/
$ touch slackbot_settings.py
$ touch run.py

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

“slackbot_settings.py”;

# -*- coding: utf-8 -*-

~~~

API_TOKEN = "xoxb-xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxx"

~~~

DEFAULT_REPLY = "Sorry but I didn't understand you"

DEFAULT_REPLYにはコマンドが解釈できなかった場合の返事を書いておきます。

続いて”run.py”にbotを起動するコードを記述します。
最低限必要な記述は以下の通りです。

“run.py”:

# -*- coding: utf-8 -*-

from slackbot.bot import Bot
def main():
    bot = Bot()
    bot.run()

if __name__ == "__main__":
   main()

記述が終わったら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用のディレクトリにプラグイン用のディレクトリを作成します。

$ cd tintribot/
$ mkdir plugins
$ touch plugins/__init__.py

Slackbotのプラグインとして読み込ませるディレクトリはモジュールでなければならないので”__init__.pyを作成します。
これは存在さえすれば良いので空ファイルで構いません。

次にプラグインがロードされるように”slackbot_settings.py”に以下の設定を記述します。

PLUGINS = [
  'plugins',
]

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

Tintriのライブラリの追加

実はTintriのAPIを操作するにあたり、Tintri by DDNの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]+- run.py(もしくはTintribot.py)
           +- slackbot_settings.py
           +- [plugins] +- __init__.py(サイズ0、ファイルの存在のみ)
                        +- tintri_1_1.py(Tintri/tintri-api-examplesより入手)
                        +- tintri_mention.py
                        +- tintri_operation_v1.py
                        …

Tintribotの設定

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

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

# vmstores['VMstore-Name'] = ('VMstore-IP/Name', 'VMstoreUser', 'VMstorePass')
vmstores['tintri-001'] = ('192.168.1.x', 'admin', 'tintri')
vmstores['tintri-002'] = ('192.168.2.x', 'admin', 'tintri')

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

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

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

Tintribotを動かしてみる

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

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

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

help

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

Usage:
@botname:tintri [TintriHostName] show... Show {appliance_info, dashboard, alert, vmlist} status.
@botname:tintri [TintriHostName] {command} help... Show {command} 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]
となります。

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

Tintribotを使ってみる

それでは早速Tintribotを使ってみましょう。
本原稿執筆時点ではTintribotには以下の機能があります。

  • VMstoreのアプライアンス情報を取得する
  • VMstoreのDashboard情報を取得する
  • VMstoreのalertとnotice情報を取得する
  • VMstore上の仮想マシンの情報を取得する

VMstoreのアプライアンス情報を取得する

アプライアンスの情報を取得するには、Tintribotに対して以下のコマンドを入力します。

@tintribot:tintri tintri-001 show appliance_info

このコマンドではVMstoreの型番やOSのバージョンを取得することができます。

正常に動作した結果は以下の通りです。

+-------------+--------------------------+
| Info        | Value                    |
+-------------+--------------------------+
| Product     | Tintri VMstore           |
| Model       | T540                     |
| OS version  | 3.2.2.1-6163.33224.16186 |
| API version | v310.21                  |
+-------------+--------------------------+

VMstoreのDashboard情報を取得する

Dashboard情報を取得するには、Tintribotに対して以下のコマンドを入力します。

@tintribot:tintri tintri-001 show dashboard

このコマンドではVMstoreの管理画面にログインした直後のDashboardタブ上の情報を取得することができます。
おそらくもっとも良く使うコマンドかもしれませんね。

正常に動作した結果は以下の通りです。

+--------------------------------+---------------+
|           Attributes           |     Values    |
+--------------------------------+---------------+
|      Flash hit Ratio (%)       |     100.0     |
|      Network latency (ms)      |      0.2      |
|      Storage latency (ms)      |      0.3      |
|       Disk latency (ms)        |      0.0      |
|       Host latency (ms)        |      0.0      |
|       Total latency (ms)       |      0.5      |
|    Perf. Reserves allocated    |     44.29     |
| Space used live Physical (GiB) | 6264.61242676 |
|     Space used other (GiB)     | 1222.21862793 |
|           Read IOPS            |      1375     |
|           Write IOPS           |      876      |
|     Throughput Read (MBps)     |     328.31    |
|    Throughput Write (MBps)     |     10.53     |
+--------------------------------+---------------+

Dashboard情報を取得するには、Tintribotに対して以下のコマンドを入力します。

@tintribot:tintri tintri-001 show alert

このコマンドではVMstoreの管理画面のAlertsタブ上の情報を取得することができますが……

正常に動作した結果は以下の通りです。

+-----+-------------------------------+----------+---------+---------------------------------------------------------------------------+
| No. | lastUpdatedTime               | severity | comment | message                                                                   |
+-----+-------------------------------+----------+---------+---------------------------------------------------------------------------+
|  1  | 2016-06-14T12:37:49.159+09:00 | NOTICE   |         | LOG-WF-0002: [1321399] Imported clones to hypervisor manager              |
|  2  | 2016-06-06T21:33:10.869+09:00 | NOTICE   |         | LOG-WF-0002: [1281265] Imported clones to hypervisor manager              |
|  3  | 2016-06-06T21:33:10.868+09:00 | NOTICE   |         | LOG-WF-0081: [1281264] VM has been cloned successfully.                   |
|  4  | 2016-06-06T21:24:21.473+09:00 | ALERT    |         | LOG-WF-0004: [1264726] Failed to add clones.                              |
|  5  | 2016-06-06T21:24:22.958+09:00 | ALERT    |         | LOG-WF-0004: [1264700] Failed to add clones.                              |
|  6  | 2016-06-06T21:24:24.211+09:00 | ALERT    |         | LOG-WF-0004: [1264609] Failed to add clones.                              |
|  7  | 2016-06-06T21:24:25.845+09:00 | ALERT    |         | LOG-WF-0004: [1264556] Failed to add clones.                              |
|  8  | 2016-06-01T20:16:41.103+09:00 | NOTICE   |         | LOG-WF-0002: [1252395] Imported clones to hypervisor manager              |
|  9  | 2016-06-01T20:09:56.775+09:00 | NOTICE   |         | LOG-WF-0002: [1252344] Imported clones to hypervisor manager              |
|  10 | 2016-05-11T16:39:22.347+09:00 | NOTICE   |         | LOG-WF-0002: [1144617] Imported clones to hypervisor manager              |
|  11 | 2016-05-11T16:26:57.542+09:00 | NOTICE   |         | LOG-WF-0002: [1144555] Imported clones to hypervisor manager              |
|  12 | 2016-05-09T16:42:53.191+09:00 | NOTICE   |         | LOG-WF-0002: [1134034] Imported clones to hypervisor manager              |
|  13 | 2016-04-26T14:50:25.690+09:00 | NOTICE   |         | LOG-WF-0002: [1066577] Imported clones to hypervisor manager              |
|  14 | 2016-03-14T16:53:22.062+09:00 | NOTICE   |         | LOG-WF-0002: [838771] Imported clones to hypervisor manager               |
|  15 | 2016-01-09T05:10:17.235+09:00 | NOTICE   |         | LOG-TPS-0034: [505251] Autosupport uploader failed to upload              |
|  16 | 2016-01-09T03:10:18.276+09:00 | NOTICE   |         | LOG-TPS-0034: [504796] Autosupport uploader failed to upload              |
|  17 | 2016-01-09T02:02:03.614+09:00 | NOTICE   |         | LOG-TPS-0034: [504573] Autosupport uploader failed to upload              |
|  18 | 2015-12-14T18:40:07.597+09:00 | NOTICE   |         | LOG-WF-0002: [380892] Imported clones to hypervisor manager               |
|  19 | 2015-12-14T18:35:42.532+09:00 | NOTICE   |         | LOG-WF-0002: [380856] Imported clones to hypervisor manager               |
|  20 | 2015-12-14T16:58:34.468+09:00 | NOTICE   |         | LOG-VCACHE-0028: [380524] Re-established contact with hypervisor manager, |
+-----+-------------------------------+----------+---------+---------------------------------------------------------------------------+

ご覧のとおり非常に横に長い状態で出力されますのでご注意ください。(これでも省略しています……)

モバイルの場合は参考程度に確認するぐらいしかできません。

なお、一度に表示するログの行数は”tintri_operation_v1.py”の”create_alerts_notices_table”関数にある
“number_of_items_to_display_on_bot”で指定しています。デフォルトは最新から20行です。

VMstore上の仮想マシンの情報を取得する

VMstore上の仮想マシン情報を取得するには、Tintribotに対して以下のコマンドを入力します。

@tintribot:tintri tintri-001 show vmlist

このコマンドではVMstoreの管理画面にログインした直後のDashboardタブ上の情報を取得することができますが……
VMstore上の仮想マシン数が多いとSlackで表示しきれないようです。

そのため仮想マシン名で検索ができるようになっています。

@tintribot:tintri tintri-001 show vmlist search [検索キーワード]

仮想マシン名を正規表現で検索し、マッチした仮想マシンのみ情報を返します。
例えば仮想マシン名に”log”が含まれているサーバの情報を取得する場合は以下のようなコマンドとなります。

@tintribot:tintri tintri-001 show vmlist search log

上記の条件で正常に動作した結果は以下の通りです。

+------------------------+-----------------+---------------------+---------------------+----------------+---------------+
| VM name                | flashHitPercent | operationsTotalIops | throughputTotalMBps | latencyTotalMs |  spaceUsedGiB |
+------------------------+-----------------+---------------------+---------------------+----------------+---------------+
| syslog-001             |      100.0      |          0          |         0.0         |      0.0       | 111.374816895 |
| web-log-001            |      100.0      |          1          |         0.01        |      0.0       | 15.1644897461 |
| web-log-002            |      100.0      |          1          |         0.01        |      0.0       | 7.38586425781 |
| log-001                |      100.0      |          0          |         0.0         |      0.0       | 3.59130859375 |
| loganalyze-001         |      100.0      |          38         |         1.07        |      1.2       | 30.1705932617 |
| service-log-001        |      100.0      |          22         |         0.29        |      2.2       | 121.751098633 |
| log-proxy-001          |      100.0      |          0          |         0.01        |      0.0       | 139.389648438 |
| service2-log-002       |      100.0      |          0          |         0.0         |      0.0       | 412.418823242 |
| test-log-001           |      100.0      |          0          |         0.01        |      0.0       | 17.8955078125 |
+------------------------+-----------------+---------------------+---------------------+----------------+---------------+

こちらもご覧のとおり非常に横に長い状態で出力されますのでご注意ください。

なお、仮想マシンのどの情報(FlashHit率やIOPSなど)を表示するかは、”tintri_operation_v1.py”の”create_vmstats_table”関数にある“stat_fields”で指定しています。他にどのようなフィールドがあるかはTintri by DDNのAPIドキュメントを参照してください。

まとめ

Tintri VMstoreをbotで管理することで、外出先から社内に接続してVMstoreの管理画面にログインすることなく、いつでもどこでも手軽にVMstoreの状態を把握できるようになりました。
そして、現状でさえ手間いらずなVMstoreがさらにお手軽になりました!

単純な仕組みではありますが、障害発生時の初動調査としてはわりと手軽に出来るようになったと感じています。
botが返事を返してくれるのも、ちょっとうれしいものですね。

REST APIには他にも様々な機能があるため、実装次第でより様々な機能を追加できますし、同様にAPIを公開している様々な機器に関しても同様に管理できるのではないかと夢が広がっています。
それに、このTintribotもまだまだ手を加えるところがたくさんあります!

みなさんもちょっとしたアイデアを元に、ぜひbotやAPIを利用した運用管理に挑戦してみてください!

なお、本記事で紹介したTintribotはこちらで公開しています