仮想LB(vTM)と自動化ツール(StackStorm)を連携してみる

# はじめに
仮想LB/ADCの登場によって、さくっとLB/ADCを立ち上げられるようになったのはうれしいけど、
例えばバックエンドのサーバ負荷が上がってきたから、サーバを追加してLB/ADCにも自動で設定を投入するとか、帯域使用量に応じてLB/ADCの割当帯域を自動で増減したいとか、運用面においても諸々さくっと自動でやって欲しいといった要望はよく聞かれます。

LB/ADC製品単体ではこうした要望に応えられないものの、自動化ツールにあやかればやれるんじゃないか…ということで、イベントドリブンな自動化ツール[StackStorm](https://stackstorm.com/v)を用いて、[Brocvade社の仮想LB製品 vTM](http://www.brocade.com/ja/products-services/software-networking/application-delivery-controllers/virtual-traffic-manager.html)(前身SteeplApp)に対する、自動化制御を試してみたいと思います。

# 実施内容
vTMの帯域使用率の上昇をトリガーとして、追加の帯域ライセンスをvTMに対して自動で割り当てる、
といった自動化制御を試してみたいと思います。

vTMには、[Services Director(SD)](http://www.brocade.com/ja/products-services/software-networking/application-delivery-controllers/services-director.html)という管理コントローラ的なコンポーネントが存在します。
SDではバルクで購入した帯域ライセンスを配下のvTMに割り当てたリ、vTMの帯域使用量や死活監視など、vTMの管理・運用操作を行うことができます。

今回はSDがvTMの帯域使用量を監視し、閾値を超えた場合にvTMに対して帯域ライセンスを割り当てる…といった処理を自動化してみたいと思います。
イメージ図は下記の通りです。

![SnapCrab_NoName_2017-1-6_17-3-45_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/3222ac70-4b40-c82d-89fb-9d93cf93c3a0.png)

# 初期設定
前提として、StackStorm、vTM及びSDの構築・初期設定は完了しているものとします。
StackStormのインストール手順は[こちら](http://qiita.com/KUROPON/items/eaa0090e2be3e7e7d412)。
### 1. Packのインストール
StackStormでvTMに関するワークフローを定義するため、
Packと呼ばれるソフトウェアコンポーネントによって、機能拡張を行います。
Packは下記コマンドにより、github上からインストールします。

```
$ st2 run packs.installpacks=vadc
```

### 2. configファイルの作成
インストールしたvADC Packの設定を定義する為、configファイルを作成します。
configファイルには、SDのIPアドレスやログイン情報等を書き込みます。
/opt/stackstorm/configs/ディレクトリ下に新規で作成します。

```
$ cd /opt/stackstorm/configs/
$ vi vadc.yaml
---
brcd_sd_proxy: true
brcd_sd_host: "https://SDのIPアドレス:SDのREST API用ポート番号/"
brcd_sd_user: "SDのログインユーザ"
brcd_sd_pass: "SDのログインパスワード"
```

コンフィグ作成後、下記コマンドでリロードします。

```
$ st2ctl reload --register-configs
```

# アクションを実行してみる
まずはStackStormとSD間でREST API経由での疎通が取れているか確認するため、
アクションを実行してみたいと思います。

"vadc.bsd_list_vtms"アクションにより、SD経由でvTMの一覧を取得してみます。

```
$ st2 action execute vadc.bsd_list_vtms
To get the results, execute:
 st2 execution get 586f17ca770a34079d0172f1

$ st2 execution get 586f17ca770a34079d0172f1
id: 586f17ca770a34079d0172f1
status: succeeded (7s elapsed)
parameters: None
result:
  exit_code: 0
  result:
  - bandwidth: 100
    host_name: ''
    name: Instance-6PNX-VEJP-DJLD-YH8N
    status: Active
    stm_feature_pack: STM-300
    tag: vTM_57
  - bandwidth: 50
    host_name: ''
    name: Instance-ARGM-FUNJ-IPIC-R492
    status: Active
    stm_feature_pack: STM-300
    tag: vTM_56
```

# ルールを実行してみる
StackStormとSD間で疎通が取れていることを確認できたので、
実際に自動化処理を行うためのルールを動作させてみたいと思います。
StackStormではトリガーとアクションの組合せにより、ルールを定義します。
vADC Packでは、トリガーとして下記2つのトリガーが用意されています。

+ vadc.bsd_failure_event
+ vadc.bsd_bandwidth_event

今回はトリガーとして、”vadc.bsd_bandwidth_event"を使います。
同トリガーによってvTMの帯域使用率を監視し、アクションとして"bsd_set_vtm_bandwidth"を使い、SDからvTMに対してライセンス割当設定を行います。

上記ルールは、あらかじめPack上で定義されていますので、今回はこちらを使用し、動作を確認したいと思います。
ルールの有効化手順は下記の通りです。

###1. センサーの有効化
"vadc.bsd_bandwidth_event"トリガーを使うため、下記コマンドで同トリガーが定義されたセンサーを有効化します。

```
$ st2 sensor enable vadc.brcdBwSensor
```

vadc.brcdBwSensorが有効化されていることを確認します。

```
$ st2 sensor list
+-----------------------------------+----------+-------------------------------------------------------------+-------+
| ref                               | pack     | description                                                 |enabled|
+-----------------------------------+----------+-------------------------------------------------------------+-------+
| linux.FileWatchSensor             | linux    | Sensor which monitors files for new lines                   | True  |
| vadc.brcdBwSensor                 | vadc     | Brocade SD Bandwidth Sensor                                 | True  |
| vadc.brcdSdSensor                 | vadc     | Brocade Service Director Sensor                             | True  |
+-----------------------------------+----------+-------------------------------------------------------------+-------+
```

###2. ルールの編集
"vadc.bsd_bandwidth_modify"のルールを定義したファイルを修正し、各種パラメータを定義します。
修正箇所は下記のとおりです。

```
$ vi bsd_bandwidth_modify.yaml
---
    name: "bsd_bandwidth_modify"
    pack: "vadc"
    description: "Realtime Bandwidth Updater for BSD"
    enabled: false

    trigger:
        type: "vadc.bsd_bandwidth_event"

    criteria:
        trigger.action:
            type: "greaterthan" #←修正
            pattern: 80         #←修正(アクション実行の閾値を指定)

    action:
        ref: "vadc.bsd_set_vtm_bandwidth"
        parameters:
            vtm: "{{trigger.instance}}"
            bw: "300"  #←修正(増加後の値を指定、単位はMbps)
```

修正後、下記コマンドでリロードします。

```
$ st2ctl reload --register-rules
```

###3. ルールの有効化
下記コマンドで"vadc.bsd_bandwidth_modify"ルールを有効化します。

```
$ st2 rule enable vadc.bsd_bandwidth_modify
```

vadc.bsd_bandwidth_modifyが有効化されていることを確認します。

```
$ st2 rule list
+-----------------------------------+----------+-----------------------------------------------------------+---------+
| ref                               | pack     | description                                                |enabled |
+-----------------------------------+----------+-------------------------------------------------------------+-------+
| vadc.bsd_bandwidth_alert          | vadc     | Realtime Bandwidth Alerts for BSD                           | False |
| vadc.bsd_bandwidth_modify         | vadc     | Realtime Bandwidth Updater for BSD                          | True  |
| vadc.bsd_bandwidth_notify         | vadc     | Realtime Bandwidth Alerts for BSD                           | False |
| vadc.bsd_chatops                  | vadc     | Send alert to ChatOps on BSD Monitor events                 | False |
| vadc.vtm_fail_maintenance         | vadc     | Enter maintenance mode when all nodes fail                  | False |
+-----------------------------------+----------+-------------------------------------------------------------+-------+
```

###4. ルールの挙動確認
100Mの帯域が割り当てられたvTMに対して負荷をかけ、
使用帯域が80Mを超えた際にルールで指定した値(300M)に帯域が増加することを確認します。

+ SDの管理画面(負荷発生前)
SDのGUIからvTMの割当帯域を確認すると100Mとなっています。
![SnapCrab_NoName_2017-1-6_17-24-49_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/8e1867ff-5546-a58d-3543-23bae8a9707c.png)

+ vTMの管理画面(負荷発生中)
vTMのGUIにて帯域使用量を確認、上限(100M)に達している。
![SnapCrab_NoName_2017-1-6_17-34-9_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/276f664e-920a-d95b-43eb-c909fa25e7ae.png)


+ StackStorm側でアクションが実行されていることを確認する

```
$ st2 execution list -ln3
+--------------------------+----------------------------+--------------+------------------------+-------------------------------+-------------------------------+
| id                       | action.ref                 | context.user | status                 | start_timestamp               | end_timestamp                 |
+--------------------------+----------------------------+--------------+------------------------+-------------------------------+-------------------------------+
| 586f5706770a3402fcd1aff7 | vadc.bsd_set_vtm_bandwidth | stanley      | succeeded (1s elapsed) | Fri, 06 Jan 2017 08:36:22 UTC | Fri, 06 Jan 2017 08:36:23 UTC |
| 586f570b770a3402fcd1affd | vadc.bsd_set_vtm_bandwidth | stanley      | succeeded (2s elapsed) | Fri, 06 Jan 2017 08:36:27 UTC | Fri, 06 Jan 2017 08:36:29 UTC |
| 586f5738770a3402fcd1b019 | core.local                 | stanley      | succeeded (1s elapsed) | Fri, 06 Jan 2017 08:37:12 UTC | Fri, 06 Jan 2017 08:37:13 UTC |
+--------------------------+----------------------------+--------------+------------------------+-------------------------------+-------------------------------+
$ st2 execution get 586f570b770a3402fcd1affd
id: 586f570b770a3402fcd1affd
status: succeeded (2s elapsed)
parameters:
  bw: 300
  vtm: Instance-ARGM-FUNJ-IPIC-R492
result:
  exit_code: 0
  result: null
  stderr: ''
  stdout: ''
```

+ SDの管理画面(負荷発生後)
SDのGUIからvTMの割当帯域を確認すると、割当帯域が300Mに変更される。
![SnapCrab_NoName_2017-1-6_17-35-41_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/c7fecb35-968e-83a5-5bf9-e4b31829dc8a.png)

#さいごに
今回は仮想LB/ADCと自動化ツールの連携方法について取り上げました。
vADC Packでは今回取り合げたアクションの他にもいくつかのアクションが存在し、
それらを用いればVirtual Serverの設定やバックエンドサーバの登録・削除、
プールの作成・削除など、様々な処理を行うことができます。
次回以降、こうしたその他アクションとトリガーを連携させた場合も取り上げていきたいと思います。

当社ではソフトウェア関連取組みの一環として、クラウド型パフォーマンスモニタサービス「New Relic」を提供しています。詳しくは[こちら](https://newrelic.nissho-ele.co.jp/)。