SNMP系コマンドについて久々にちょっとだけ調べた

# HPサーバの管理をしたい
会社で買ったHP DL380のCPU負荷率とかメモリ使用率とかをSNMPで調べてください、というかさっさと調べろよ。ということになって今更ながらHPのSNMP mibについて色々調べる羽目になった。

## SNMPでよくある誤解
SNMPの内容を調べる前に、僕の周りでよく勘違いされている**SNMPあるある**を話しておこう。
L2SWの物理ポートのリンクアップ状態をZabbixのようなネットワーク管理サーバからSNMPで取得する場合

* SNMPサーバはL2SW
* ネットワーク管理サーバはSNMPクライアント

ということだ。Zabbixのようなネットワーク管理サーバはWebサーバではあるが、SNMPの情報を提供しているわけではなく、L2SWが提供してくれているポートの情報をもらっているので、SNMPとしてはクライアントになる。
どうも僕の周りには、この辺を誤解している人がよくいる。PCやデータセンター用のサーバという筐体に収まっている物がサーバではなく、あくまで機能でサーバ/クライアントとなっていることの整理がついていないようだ。

## mibのファイルはどこにある？
今回HPのサーバにインストールされているのはRedHat7系のLinuxなんだが、HPは「hp-snmp-agents」というRPMファイルを提供してくれている。これをネットからダウンロードし、RPMコマンドを使ってサクッとインストールして、```/etc/snmp/snmpd.conf```をそれなりに設定すればとりあえずmibの値を読むことができるようになる。

## ASN.1を読んでみる
HPサーバのmibは、```1.3.6.1.4.1.232.6```というmibツリー以下に記載される。ヘルスチェックのmibファイルは、```cpqhlth.mib```というファイルでASN.1という書式で書かれている。**cpq**は**コンパック**だ。
かつてDECがApoloを買収し、そのDECがコンパックに吸収合併され、さらにコンパックがHPに吸収合併されるという時代の流れの中で、コンパックはエンタープライズmibの番号**6**に名前を残している。DECとapoloはどこかに残っているのだろうか？という余談は置いておく。
試しに```1.3.6.1.4.1.232.6.1.3```の内容を読んでみよう。

```cpqhelth.mib抜粋
    cpqHeMibCondition OBJECT-TYPE
        SYNTAX  INTEGER {
            other(1),
            ok(2),              -- default
            degraded(3),
            failed(4)
            }
        ACCESS  read-only
        STATUS  mandatory
        DESCRIPTION
            "The overall condition.

             This object represents the overall status of the server health
             system represented by this MIB."
        ::= { cpqHeMibRev 3 }
```
このmibのDESCRIPTIONの内容をgoogle先生に聞いてみると「全体の状態。このオブジェクトは、このMIBによって表されるサーバヘルスシステムの全体的なステータスを表します。」と教えてくれる。どうやらこのmibはサーバの健康状態が良いか悪いかを表しているらしい。
mibの値をsnmpクライアントでgetすると、```INTEGER```で返事が帰ってくる。帰ってくる値は1から4まで。問題なければ**2**が返事として帰ってくる。**3**の**degraded**と**4**の**failed**の違いがよくわからないが、**3**は**ちょっとダメ**、**4**は**全然ダメ**的な状態なんだろう。
**ACCESS**は**read-only**なのか**read-write**なのかが書かれている。今回は読むだけなのでgetかget-nextでデータを取得する。
ちなみに書ける場合はsetでデータを設定することができる。L2SWの物理ポートのシャットダウンなんかに使うことができる。
**STATUS**は**mandatory**とあるので、このmibは必須であることがわかる。必須でない場合は、**optional**になっている。

## mibツリーの数字しかわからない場合
地道にググればmibファイルまでたどり着くが、手っ取り早い方法を見つけた。mibの数字をそのままgoogleに突っ込んで検索する。すると、
[ここ](http://oid-info.com/)や[ここ](http://www.circitor.fr)や[ここ](http://www.oidview.com/)などでmibの内容を見ることができる。これはとても便利。先人の努力に感謝だ。
試しにgoogleで```snmp 1.3.6.1.4.1.232.6.1.3```と検索してみると、一番上に表示された検索結果の[ここ](http://oidref.com/1.3.6.1.4.1.232.6.1.3)では、

```
cpqHeMibCondition OBJECT-TYPE
SYNTAX INTEGER {
other(1),
ok(2), -- default
degraded(3),
failed(4)
}
ACCESS read-only
STATUS mandatory
DESCRIPTION
"The overall condition.
This object represents the overall status of the server health
system represented by this MIB."
-- :CPQ,DEV:
-- The MIB condition is set as follows:
--
-- other(1): When the hardware or driver does not support the
-- applicable features.
--
-- failed(4): If any single component condition is failed.
--
-- degraded(3): If any single component condition is degraded and
-- none are failed.
--
-- ok(2): If no component conditions are failed or degraded.
-- :CPQ,ENDDEV: 
```
こんな感じで内容詳細を知ることができる。

## snmptranslateでMIBの内容を表示する
すでにサーバにインストールされているMIBの内容詳細を知りたい場合は、次の2つの方法がある。

1. ```/usr/share/snmp/mibs/```にあるmibファイルを読む
2. snmptranslateを使ってMIBの内容を表示する


試しに、LinuxのCPU負荷を取得するためのOIDの内容を表示させてみると

```
$ snmptranslate -Td HOST-RESOURCES-MIB::hrProcessorLoad
HOST-RESOURCES-MIB::hrProcessorLoad
hrProcessorLoad OBJECT-TYPE
  -- FROM       HOST-RESOURCES-MIB
  SYNTAX        Integer32 (0..100)
  MAX-ACCESS    read-only
  STATUS        current
  DESCRIPTION   "The average, over the last minute, of the percentage
        of time that this processor was not idle.
        Implementations may approximate this one minute
        smoothing period if necessary."
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) host(25) hrDevice(3) hrProcessorTable(3) hrProcessorEntry(1) 2 }
```
と表示される。
同じ内容のOIDを数字表記で調べてみると

```
$ snmptranslate -Td .1.3.6.1.2.1.25.3.3.1.2
HOST-RESOURCES-MIB::hrProcessorLoad
hrProcessorLoad OBJECT-TYPE
  -- FROM       HOST-RESOURCES-MIB
  SYNTAX        Integer32 (0..100)
  MAX-ACCESS    read-only
  STATUS        current
  DESCRIPTION   "The average, over the last minute, of the percentage
        of time that this processor was not idle.
        Implementations may approximate this one minute
        smoothing period if necessary."
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) host(25) hrDevice(3) hrProcessorTable(3) hrProcessorEntry(1) 2 }
```
となり、当たり前だが、これら2つは　**完全に一致！**　となっている。

MIBの値が何を示しているのかを知る方法としては、これだけ知っていれば、あまり困ることはないと思う。