ZabbixでVMwareの監視登録（パフォーマンス値取得）を手動でやってみる

Advent Calendar初参加になります！宜しくお願いします。
私がZabbixを使い始めたきっかけは `Zabbixは監視対象に縛られない監視システムが作れる`[^1] という点でした。
昨今のインフラ機器はWeb API(SOAPやREST)が標準提供されているものが多くなってきており昔のように専用ツールじゃないと監視が出来ないというところは緩和されてきている感じがします。
サーバやネットワーク・ストレージ機器や仮想レイヤー(ハイパーバイザーやVM)などをまとめてZabbixで管理・監視ができる時代はとても便利になったと思っています。
最近、Zabbixを使ってVMware監視をやっているので、今回はZabbixの標準機能で対応可能なVMware監視について書いてみようと思います。

[^1]: 自由度が高いので作り込みすぎるとZabbixおじさんが必要になってしまいますが...

# 前提として

## 環境説明

今回、試した環境は以下のものになります。

| 項目    | バージョン |
|:--------|:-----------|
| Zabbix  | 3.0.13-2   |
| OS      | CentOS 7.4 |
| vCenter | 6.5        |
| ESXi    | 6.5        |

所々でpythonを使ったスクリプトを使った解説もしていこうと思います。

# ZabbixでVMwareを監視

## Zabbixで可能な監視項目

Zabbixで出来るVMware監視項目は以下のページを参照ください。

https://www.zabbix.com/documentation/3.0/manual/config/items/itemtypes/simple_checks/vmware_keys

クラスタやデータストアなどのディスカバリやVM・ハイパーバイザーのリソース監視(CPU、メモリなど)ができます。
ちなみに `vmware.hv.perfcounter` や `vmware.vm.perfcounter` キーを使うことで、VMwareが管理しているパフォーマンス値をほぼ取得することが可能です。やり方については後述します。

## ZabbixでVMwareを監視するには

Zabbixでは、VMwareのAPI(SOAP)を使って監視をします。
監視を始めるには以下の設定が必要です。

| パラメーター          | 説明                                                             |
|:----------------------|:-----------------------------------------------------------------|
| StartVMwareCollectors | VMwareの監視プロセス数(1以上にする)                              |
| VMwareCacheSize       | APIで取得した値をキャッシュする共有メモリサイズ                  |
| VMwareFrequency       | APIでステータス情報などを取得する間隔(クラスタのステータスなど)  |
| VMwarePerfFrequency   | APIでパフォーマンスカウンターから値を取得する間隔(CPU使用率など) |
| VMwareTimeout         | vCenterやESXiハイパーバイザーからの応答を待つ秒数                |

一先ず動かすだけであれば `StartVMwareCollectors` を1以上にしてみてください :-)

```
[root@localhost ~]# vi /etc/zabbix/zabbix_server.conf
(snip)
### Option: StartVMwareCollectors
#       Number of pre-forked vmware collector instances.
#
# Mandatory: no
# Range: 0-250
# Default:
# StartVMwareCollectors=0
StartVMwareCollectors=1
(snip)
[root@localhost ~]# systemctl start zabbix-server
```

## Zabbixに監視登録をする

### 仮想マシンの監視登録

Zabbixに仮想マシンのCPU使用率の監視登録をやってみたいと思います。
Zabbixではインストール時に標準でVMware監視テンプレートが入っていますが、今回はそれを使わず手作業で登録してみたいと思います。
手動で登録することで、ZabbixがVMwareの何の情報を元に取得しているか？など理解ができると思います。
Zabbixで仮想マシンの監視を登録するには以下の項目が必要です。

* vCenter/ESXiのアドレス(`https://ip or FQDN/sdk`)
* vCenter/ESXiのログインアカウント
* vCenter/ESXiのログインアカウントのパスワード
* 仮想マシンのinstanceUuid

Zabbixでは `仮想マシンのinstanceUuid` を元にしてVMware環境から監視対象を選別しています。
※Zabbixのディカバリ機能を使えばこんなややこしい事しなくても自動で取得してくれます。
instanceUuidを確認する方法としては2つあります。

* Managed Object Browserから確認する
  * `https://IP or FQDN/mob` でアクセスする事ができます。詳細に知りたい方はは [Managed Object Browser](http://pubs.vmware.com/vsphere-6-5/index.jsp#com.vmware.wssdk.pg.doc/PG_Appx_Using_MOB.21.1.html?resultof=%2522%254d%2561%256e%2561%2567%2565%256d%2565%256e%2574%2522%2520%2522%256d%2561%256e%2561%2567%2522%2520%2522%254f%2562%256a%2565%2563%2574%2522%2520%2522%256f%2562%256a%2565%2563%2574%2522%2520%2522%2542%2572%256f%2577%2573%2565%2572%2522%2520%2522%2562%2572%256f%2577%2573%2565%2572%2522%2520) を確認ください。
* スクリプトでAPI経由から取得する

今回は後者のスクリプト経由で確認してみたいと思います。
確認するのに以下のツール(Managed Objectのプロパティや値、メソッドなど確認できる)を使ってみます。

[mob-property-view](https://github.com/sky-joker/mob-property-view)

```
[root@localhost ~]# git clone https://github.com/sky-joker/mob-property-view.git
[root@localhost ~]# cd mob-property-view/
[root@localhost mob-property-view]# pip3 install -r requirements.txt
[root@localhost mob-property-view]# chmod +x mob-property-view.py
```

早速instanceUuidを取得してみたいと思います。
ここでは `devel` という仮想マシン名がついたものから取得してみます。

```
[root@localhost mob-property-view]# ./mob-property-view.py -vc vcenter01.local --mob VirtualMachine -t devel --property config | grep instanceUuid
Password:
   instanceUuid = '50376abf-fc92-ed1c-0923-1ce796c1d0e0',
```

ホストを追加してみます。

| 項目     | 説明                                         |
|:---------|:---------------------------------------------|
| ホスト名 | instanceUuidを入力します                     |
| 表示名   | ホスト名など人間が分かりやすい名前を入れます |

`グループ` や `IPアドレス` などを設定して `追加` をクリックします。

![](https://sky-joker.tech/wp-content/uploads/2017/11/01d33bd87d6c9f17708bf03421228981.png)

次に `マクロ` を登録します。
マクロにはvCenter/ESXiのアドレスやアカウント情報を入力します。

| 項目        | 説明                                                                  |
|:------------|:----------------------------------------------------------------------|
| {$URL}      | vCenter/ESXiのAPIアドレスである `https://IP or FQDN/sdk` を入力します |
| {$USERNAME} | vCenter/ESXiへのログインアカウント名を入力します                      |
| {$PASSWORD} | vCenter/ESXiへのログインアカウントのパスワードを入力します            |

![](https://sky-joker.tech/wp-content/uploads/2017/11/37b010837d8dbdd4451e7c65982d2174.png)

入力後 `更新` します。

次に `アイテム` を作成してみます。
※`アプリケーション` はここでは省きます。

アイテムは以下のように登録してみました。

| 項目       | 説明                                                      |
|:-----------|:----------------------------------------------------------|
| 名前       | アイテム名                                                |
| タイプ     | シンプルチェック                                          |
| キー       | 仮想マシンのCPU使用量(Hz)を取得するキーを指定             |
| ユーザー名 | マクロで登録したユーザー                                  |
| パスワード | マクロで登録したパスワード                                |
| データの値 | 10進数                                                    |
| 単位       | hz                                                        |
| 更新間隔   | データ取得間隔、VMwarePerfFrequencyを下回る値を設定しない |

![](https://sky-joker.tech/wp-content/uploads/2017/11/d26538bd56e35dd83be26140cd2bc256.png)

`最新データ` で値が取得できれ入れば大丈夫です。

### ハイパーバイザーの監視登録

基本、手順は同じです。
ただ、登録するuuidとキーが違います。

ハイパーバイザー(ここでは、esxi-03.local)はinstanceUuidではなく以下のuuidを使用します。

```
[root@localhost mob-property-view]# ./mob-property-view.py -vc vcenter01.local --mob HostSystem -t esxi-03.local --property hardware | grep uuid
Password:
      uuid = '32393735-3733-504a-5430-343634394a43',
```

キーも `vmware.hv.cpu.usage[{$URL},{HOST.HOST}]` を使います。

# perfcounterキーを使ってみる

標準で用意されているアイテムキーだけでは物足りなさがあります。
例えば取得できるCPU情報は `プロセッサ数` `プロセッサ有効時間` `プロセッサ利用量` しかありません。
`プロセッサ使用率` を監視したい！という人もいると思います。(私は監視したい！)
Zabbixでは、好きなパフォーマンスカウンターを監視できるよう以下のキーが用意されています。

* vmware.hv.perfcounter[<url>,<uuid>,<path>,<instance>]
* vmware.vm.perfcounter[<url>,<uuid>,<path>,<instance>]

このキーで取得したいVMwareが管理しているパフォーマンスデータを指定することで値を取得することが可能です。
VMwareを触った事ある人であれば見覚えのあるこの画面で表示されるカウンターが対象です。

![](https://sky-joker.tech/wp-content/uploads/2017/11/f63383e3de430480fe8a9c25fa0fd0cd.png)

perfcounterキーの引数は以下のものを指定します。

| パラメーター | 説明                                                |
|:-------------|:----------------------------------------------------|
| url          | vCenter/ESXiのURL                                   |
| uuid         | 監視対象のuuid(VM: instanceUuid/ESXi: uuid)         |
| path         | pathは `group/counter[rollup]` という形で指定します |
| instance     | ターゲットオブジェクトです(省略可)                  |

`path` について説明します。

| パラメーター | 説明                           |
|:-------------|:-------------------------------|
| group        | チャートメトリックを指定します |
| counter      | カウンター名を指定します       |
| rollup       | ロールアップ名を指定します     |

例えば、上図のチェックが入ってる部分を監視しようとすると以下のようになります。

`group` は `cpu` 、 `counter(内部名)` は `usage` 、 `rollup(ロールアップ)` は `平均値`

そのためpathは `cpu/usage[average]` になります。
キーを設定する場合以下のようになります。

`vmware.vm.perfcounter[{$URL},{HOST.HOST},"cpu/usage[average]",]`

設定は以下のようにします。

![](https://sky-joker.tech/wp-content/uploads/2017/11/7c36756102ef62ba6b12181f5d6fa1f2.png)

`path` に設定する情報を一覧で取得するツールを作って観ました。
以下のツールを使う事でVMwareのパフォーマンスカウンター一覧をJSON形式で表示することができます。

[vmware-get-perfcounter-info](https://github.com/sky-joker/vmware-get-perfcounter-info)

使用方法は以下のようにします。

```
$ ./vmware-get-perfcounter-info.py -vc vcenter01.local
Password:
{
  "CPU": [
    {
      "group": "cpu",
      "rollup": "none",
      "counter": "usage",
      "unit": "%"
    },
    {
      "group": "cpu",
      "rollup": "average",
      "counter": "usage",
      "unit": "%"
    },
(snip)
```

vCenter6.5のパフォーマンスカウンター一覧を参考として以下に保存しました。

[vcenterPerfCounter.json](https://gist.github.com/sky-joker/299d70c49a995f0f6c9d40e55b6ae335)

注意点としては、ツールで取得した一覧が全て取得できるわけではありません。
あくまでも、vCenterやESXiのチャートで表示される項目が取得できます。
ツールはそれ以外のもの取得するため情報量が多いです。

# まとめ

仮想マシンは `instanceUuid` ESXiは `uuid` を確認すれば手動でVMwareの監視登録が可能です。
ディスカバリ機能を使えば自動で取得してくれますが、自動登録だと一部変更できない設定内容などあるので監視登録情報を全てコントロールしたい場合は手動登録で対応できます。
また `perfcounterキー` を使う事で監視の幅が広がるので色々なパフォーマンスデータを監視してみるのは如何でしょうか :-)