AOSのMIBファイルを眺めてみた話

- この投稿は[Nutanix Advent Calendar 2018](https://adventar.org/calendars/3014)の15日目です。

## お試し環境
- みんな大好きTest Drive ~~(今更初めて使うなんて言えない…)~~
- シングルノード
- 今回はMIBファイルのDLのためだけにログイン…


Prism
![Prism](https://d2mxuefqeaa7sj.cloudfront.net/s_7D9D5BC378DECFBA7D221F798944B18F00ED023F7DD33D85431D082861A374BF_1544791171739_image.png) 

About Nutanix(NCC低くないですか？)
![NCCのバージョン低くないですか？](https://d2mxuefqeaa7sj.cloudfront.net/s_7D9D5BC378DECFBA7D221F798944B18F00ED023F7DD33D85431D082861A374BF_1544791532215_image.png)

## 設定するところ
- マニュアルとかバイブルとかサポートポータルにあると思いますが以下スクショです
- SNMPなにそれ状態だと難しいかもですが、監視とか普段から触ってる人なら特に困らないと思います
- 「DownloadMIB」クリックするとAOSのバージョンに応じたMIBファイルを見ることができます
  - 自前でSNMP監視する場合はちゃんとDLしときましょう
  - DLした後は、(centosとかなら)/usr/share/snmp/mibs配下とかに放り込んでおきましょう(/etc/snmp.confを忘れずに)
  - なおNutanixはsnmp v3です
![画面右上の歯車アイコンから](https://d2mxuefqeaa7sj.cloudfront.net/s_7D9D5BC378DECFBA7D221F798944B18F00ED023F7DD33D85431D082861A374BF_1544793170614_image.png)
![転送先設定](https://d2mxuefqeaa7sj.cloudfront.net/s_7D9D5BC378DECFBA7D221F798944B18F00ED023F7DD33D85431D082861A374BF_1544793327348_image.png)

![SNMPv3なので認証と暗号化設定](https://d2mxuefqeaa7sj.cloudfront.net/s_7D9D5BC378DECFBA7D221F798944B18F00ED023F7DD33D85431D082861A374BF_1544793247361_image.png)
![Trapは時間なかったですごめんなさい](https://d2mxuefqeaa7sj.cloudfront.net/s_7D9D5BC378DECFBA7D221F798944B18F00ED023F7DD33D85431D082861A374BF_1544793266323_image.png)


ESXiとか他の機器だと大抵v2でsnmpwalkしたりするんですが、CVMに対してはv3なので管理の仕方がアレだとアレなことになりますよね(なった)

## MIB Tree


- まずこれをみないことには始まらない
- 世の中には[こんなページ](http://www.oidview.com/mibs/detail.html)もあったりして「このMIBなんの情報だよ…」な具合にとっつきようがなければ参考にしたり(あくまで参考程度)
- ちなみにNutanixのEnterpriseIDは41263です。(日常会話でもきっとよく使うのでさっと出てきますよね)
- MIB Treeをざっと確認するには snmptranslate が楽で良いですね
  - EnterpriseIDの部分知りたいときは、.1.3.6.1.4.1 まではおまじないと覚えとくとなお楽です

```bash
    $  snmptranslate -Tp .1.3.6.1.4.1.41263 -m /usr/share/snmp/mibs/nutanix
    +--nutanix(41263)
       |
       +--softwareVersionTable(1)
       |  |
       |  +--svtEntry(1)
       |     |  Index: svtIndex
       |     |
       |     +-- -R-- Integer32 svtIndex(1)
       |     |        Range: 1..2147483647
       |     +-- -R-- String    svtControllerVMId(2)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    svtNutanixBootstrap(3)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    svtNutanixInfrastructure(4)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    svtNutanixCore(5)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    svtNutanixToolchain(6)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    svtNutanixServiceability(7)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    svtLinuxKernel(8)
       |              Textual Convention: DisplayString
       |              Size: 0..255
       |
       +--serviceStatusTable(2)
       |  |
       |  +--sstEntry(1)
       |     |  Index: sstIndex
       |     |
       |     +-- -R-- Integer32 sstIndex(1)
       |     |        Range: 1..2147483647
       |     +-- -R-- String    sstControllerVMId(2)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    sstControllerVMStatus(3)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    sstZeusStatus(4)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    sstScavengerStatus(5)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    sstMedusaStatus(6)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    sstPithosStatus(7)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    sstStargateStatus(8)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    sstChronosStatus(9)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    sstCuratorStatus(10)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    sstPrismStatus(11)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    sstAlertManagerStatus(12)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    sstStatsAggregatorStatus(13)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    sstSysStatCollectorStatus(14)
       |              Textual Convention: DisplayString
       |              Size: 0..255
       |
       +--diskStatusTable(3)
       |  |
       |  +--dstEntry(1)
       |     |  Index: dstIndex
       |     |
       |     +-- -R-- Integer32 dstIndex(1)
       |     |        Range: 1..2147483647
       |     +-- -R-- String    dstDiskId(2)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    dstControllerVMId(3)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    dstSerial(4)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- Counter64 dstNumRawBytes(5)
       |     +-- -R-- Counter64 dstNumTotalBytes(6)
       |     +-- -R-- Counter64 dstNumFreeBytes(7)
       |     +-- -R-- Counter64 dstNumTotalInodes(8)
       |     +-- -R-- Counter64 dstNumFreeInodes(9)
       |     +-- -R-- Counter64 dstAverageLatency(10)
       |     +-- -R-- Counter64 dstIOBandwidth(11)
       |     +-- -R-- Counter64 dstNumberIops(12)
       |     +-- -R-- EnumVal   dstState(13)
       |              Values: online(1), offline(2)
       |
       +--controllerVMResourceTable(4)
       |  |
       |  +--crtEntry(1)
       |     |  Index: crtIndex
       |     |
       |     +-- -R-- Integer32 crtIndex(1)
       |     |        Range: 1..2147483647
       |     +-- -R-- String    crtControllerVMId(2)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- Counter64 crtMemory(3)
       |     +-- -R-- Integer32 crtNumCpus(4)
       |     +-- -R-- String    crtName(5)
       |              Textual Convention: DisplayString
       |              Size: 0..255
       |
       +--storagePoolInformationTable(7)
       |  |
       |  +--spitEntry(1)
       |     |  Index: spitIndex
       |     |
       |     +-- -R-- Integer32 spitIndex(1)
       |     |        Range: 1..2147483647
       |     +-- -R-- String    spitStoragePoolId(2)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    spitStoragePoolName(3)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- Counter64 spitTotalCapacity(4)
       |     +-- -R-- Counter64 spitUsedCapacity(5)
       |     +-- -R-- Integer32 spitIOPerSecond(6)
       |     +-- -R-- Counter64 spitAvgLatencyUsecs(7)
       |     +-- -R-- Counter64 spitIOBandwidth(8)
       |
       +--containerInformationTable(8)
       |  |
       |  +--citEntry(1)
       |     |  Index: citIndex
       |     |
       |     +-- -R-- Integer32 citIndex(1)
       |     |        Range: 1..2147483647
       |     +-- -R-- String    citContainerId(2)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    citContainerName(3)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- Counter64 citTotalCapacity(4)
       |     +-- -R-- Counter64 citUsedCapacity(5)
       |     +-- -R-- Integer32 citIOPerSecond(6)
       |     +-- -R-- Counter64 citAvgLatencyUsecs(7)
       |     +-- -R-- Counter64 citIOBandwidth(8)
       |
       +--hypervisorInformationTable(9)
       |  |
       |  +--hypervisorEntry(1)
       |     |  Index: hypervisorIndex
       |     |
       |     +-- -R-- Integer32 hypervisorIndex(1)
       |     |        Range: 1..2147483647
       |     +-- -R-- String    hypervisorId(2)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    hypervisorName(3)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- Unsigned  hypervisorVmCount(4)
       |     +-- -R-- Unsigned  hypervisorCpuCount(5)
       |     +-- -R-- Unsigned  hypervisorCpuUsagePercent(6)
       |     +-- -R-- Counter64 hypervisorMemory(7)
       |     +-- -R-- Unsigned  hypervisorMemoryUsagePercent(8)
       |     +-- -R-- Unsigned  hypervisorReadIOPerSecond(9)
       |     +-- -R-- Unsigned  hypervisorWriteIOPerSecond(10)
       |     +-- -R-- Counter64 hypervisorAverageLatency(11)
       |     +-- -R-- Counter64 hypervisorIOBandwidth(12)
       |     +-- -R-- Counter64 hypervisorRxBytes(13)
       |     +-- -R-- Counter64 hypervisorTxBytes(14)
       |     +-- -R-- Counter64 hypervisorRxDropCount(15)
       |     +-- -R-- Counter64 hypervisorTxDropCount(16)
       |
       +--vmInformationTable(10)
       |  |
       |  +--vmEntry(1)
       |     |  Index: vmIndex
       |     |
       |     +-- -R-- Integer32 vmIndex(1)
       |     |        Range: 1..2147483647
       |     +-- -R-- String    vmId(2)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    vmName(3)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    vmHypervisorId(4)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    vmPowerState(5)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- Unsigned  vmCpuCount(6)
       |     +-- -R-- Unsigned  vmCpuUsagePercent(7)
       |     +-- -R-- Counter64 vmMemory(8)
       |     +-- -R-- Unsigned  vmMemoryUsagePercent(9)
       |     +-- -R-- Unsigned  vmReadIOPerSecond(10)
       |     +-- -R-- Unsigned  vmWriteIOPerSecond(11)
       |     +-- -R-- Counter64 vmAverageLatency(12)
       |     +-- -R-- Counter64 vmIOBandwidth(13)
       |     +-- -R-- Counter64 vmRxBytes(14)
       |     +-- -R-- Counter64 vmTxBytes(15)
       |     +-- -R-- Counter64 vmRxDropCount(16)
       |     +-- -R-- Counter64 vmTxDropCount(17)
       |
       +--controllerStatusTable(11)
       |  |
       |  +--cstEntry(1)
       |     |  Index: cstIndex
       |     |
       |     +-- -R-- Integer32 cstIndex(1)
       |     |        Range: 1..2147483647
       |     +-- -R-- String    cstControllerVMId(2)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    cstControllerVMStatus(3)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    cstDataServiceStatus(4)
       |     |        Textual Convention: DisplayString
       |     |        Size: 0..255
       |     +-- -R-- String    cstMetadataServiceStatus(5)
       |              Textual Convention: DisplayString
       |              Size: 0..255
       |
       +-- -R-- String    clusterName(501)
       |        Textual Convention: DisplayString
       |        Size: 0..255
       +-- -R-- String    clusterVersion(502)
       |        Textual Convention: DisplayString
       |        Size: 0..255
       +-- -R-- String    clusterStatus(503)
       |        Textual Convention: DisplayString
       |        Size: 0..255
       +-- -R-- Counter64 clusterTotalStorageCapacity(504)
       +-- -R-- Counter64 clusterUsedStorageCapacity(505)
       +-- -R-- Counter64 clusterIops(506)
       +-- -R-- Counter64 clusterLatency(507)
       +-- -R-- Counter64 clusterIOBandwidth(508)
       +--ntxTrap(991)
       |
       +--ntxAlert(999)
          |
          +-- -R-- Counter64 ntxAlertCreationTime(1)
          +-- -R-- String    ntxAlertDisplayMsg(2)
                   Textual Convention: DisplayString
                   Size: 0..1024
```

## 抜粋すると(※眺めて適当に解釈しているので違ってたら指摘もらえると助かります)
- softwareVersionTable(1)
  - まんまです(cvmのソフトバージョン等)
- serviceStatusTable(2)
  - 各種サービス(コンポーネント)のステータス
- diskStatusTable(3)
  - 結構詳細に取れると思います
  - シリアルも拾えるのでどのディスクがとかまで追えます
- controllerVMResourceTable(4)
  - CVMのリソース状況
- storagePoolInformationTable(7)
  - ストレージプール単位のリソース状況
- containerInformationTable(8)
  - ストレージコンテナ単位の状況
- hypervisorInformationTable(9)
  - ハイパーバイザーの状況
  - VM数が拾えたりするのでどのノードにいくつVMが乗っかってるとかはすぐわかります
- vmInformationTable(10)
  - ゲストVMの情報
  - 乗っているノード(id)や電源状態だけでなく、プロビジョニングしたvCPUやメモリもわかる
  - ここのVMのLatencyやら使用帯域やらパケロス具合も拾える
- controllerStatusTable(11)
  - CVMの稼働状況(↑のsstよりメタ的な感じ)
  - ここで拾えてるのは主に↓だったと思います。
      - ControllerVMStatus(Genesis)
      - DataServiceStatus(Stargate)
      - MetadataServiceStatus(Cassandra)
- clusterName(501)
- clusterVersion(502)
- clusterStatus(503)
- clusterTotalStorageCapacity(504)
- clusterUsedStorageCapacity(505)
- clusterIops(506)
- clusterLatency(507)
- clusterIOBandwidth(508)
  - この辺はクラスタ全体の状況

- ntxTrap(991)
- ntxAlert(999)
  - これトラップ
  - 昔なかった…よな…？(4.x台はなくて5.xから入った？)


## Nutanix(CVM？)とSNMP

少し前までお仕事でいろんな機器やらサービスの監視設定ゴリゴリしていたのですが、
Nutanixの監視をSNMPでガッツリやるのは結構しんどかったり。(使う監視ツールにもよりますが)
例えば、Zabbixなんかはテンプレートが公開されてたりするので利用すると
ほぼ何もしなくてもそれなりの監視環境が出来上がったりします。(通知やアラートの飛ばし先などは別)

  - [Nutanix Template for Zabbix](https://blog.devarieux.net/2016/03/nutanix-template-for-zabbix.html)
  - [NutanixをZabbixで監視してみる/](https://qiita.com/smzksts/items/76487307a92e7a0ce0f0)[**@smzksts**](https://qiita.com/smzksts/items/76487307a92e7a0ce0f0)

NutanixのSNMP監視でポーリングする際に気をつけることは、個々のCVMの情報を取るために
CVM毎にポーリングしても負荷が上がるだけであまり意味がないです。(クラスタが大きくなるほど負荷上がりますし)
実際に、どのノードにポーリングしても同じMIBテーブルが返ってきます。
そのため、クラスタのVIPにのみポーリングすれば十分だと思います。

以上です。