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
の内容を読んでみよう。
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に突っ込んで検索する。すると、
ここやここやここなどでmibの内容を見ることができる。これはとても便利。先人の努力に感謝だ。
試しにgoogleでsnmp 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つの方法がある。
-
/usr/share/snmp/mibs/
にあるmibファイルを読む - 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の値が何を示しているのかを知る方法としては、これだけ知っていれば、あまり困ることはないと思う。