雑な hinananoha

やさしいせかいをさがして三千里

拡張MIB(Private MIB)からZabbixテンプレートを作る話

TL;DR

1. SNMP関連の環境を整えます
2. 監視したい機器の拡張MIB (もし標準MIBをつかう場合はそれも)を取得します。
3. mib2zabbixをつかいます
github.com
4. あとは気合いで実機で試しながら必要な項目を調整します

以上

経緯とか

これをすることに至った経緯はこちらをご覧下さい。
kokura.hatenadiary.jp

というわけで、mib2zabbixをつかって、存在しないZabbix Templateをつくっていい感じにする話について説明します。

SNMPとかMIBについて

MIBに関する話を理解できる方は次の「やり方」まで飛ばして下さい。

ネットワーク機器やサーバなどの監視には、多くの場合SNMP(Simple Network Management Protocol)をつかって行われます。
SNMPとは何か、MIBの基本についてはざっくりこちらをご参照下さい。

さて、このMIBについて、ネットワーク機器の監視においては主に「標準MIB」と「拡張MIB」を用いて行われます。
標準MIBは 1.3.6.1.2.1 (MIB-II) で定められているもの、拡張MIBは 1.3.6.1.4.1 (enterprise) 以下にベンダ毎に独自で定めているものとなります。
標準MIBは「標準」であるが故に取れる情報も限られており、多くの場合欲しい情報、例えば筐体の稼働状況や温度などは拡張MIBで取得することとなります。

拡張MIBは各ベンダで公開されています。
例として、YAMAHAは以下で公開しています。
YAMAHA private MIB
ですが、この中身ですが、例えばYAMAHAのMIBのうち、YAMAHA-RT-INTERFACEでは、

-- $Id: yamaha-rt-interfaces.mib.txt,v 1.31 2019/06/27 11:54:59 y-nishihara Exp $

YAMAHA-RT-INTERFACES DEFINITIONS ::= BEGIN

IMPORTS
	mgmt, NetworkAddress, IpAddress, Counter, Gauge, TimeTicks
		FROM RFC1155-SMI
	OBJECT-TYPE
		FROM RFC-1212
	DisplayString, PhysAddress
		FROM RFC1213-MIB
	TRAP-TYPE
		FROM RFC-1215
	IANAifType
		FROM IANAifType-MIB
	yamahaRTInterfaces
		FROM YAMAHA-RT;

-- Information of interfaces

yrIfNumber OBJECT-TYPE
	SYNTAX	INTEGER
	ACCESS	read-only
	STATUS	mandatory
	DESCRIPTION
		"The number of physical and logical network interfaces
		(regardless of their current state) present on this
		system."
	::= { yamahaRTInterfaces 1 }

yrIfTable OBJECT-TYPE
	SYNTAX	SEQUENCE OF YrIfEntry
	ACCESS	not-accessible
	STATUS	mandatory
	DESCRIPTION
		"A list of physical and logical interface entries.
		The number of entries is given by the value of
		yrIfNumber."
	::= { yamahaRTInterfaces 2 }

yrIfBindTable OBJECT-TYPE
	SYNTAX	SEQUENCE OF YrIfBindEntry
	ACCESS	not-accessible
	STATUS	mandatory
	DESCRIPTION
		"A list of binding information entries between
		a lower and a higher interfaces.  Typical lower
		interface is a physical one, and typical higher
		interfae is a PP."
	::= { yamahaRTInterfaces 3 }

こんな感じのものが延々2600行近く、これが数十ファイルあり、これを全部自力で見て必要なものを探し当てるのは至難の業です。
もうちょっと見やすくするMIB Viewer的なツールも無いわけではないですが、多くは有料、無料のものも今では珍しいJavaアプリケーション。大変厳しいものがあります。

というわけで、これをどうしようか、と言うのが今回の話です。

やり方(環境構築~テンプレート完成まで)

やり方は一番最初で説明した通りなのですが、具体的に説明していきます。
なお、ここでは対象の環境として以下の環境を用いています。特にRHEL系などをご利用の場合は適宜読み替えて下さい。(多分素のDebianならこれと同じ方法で出来ると思います)

Requirement

  • package
  • その他
    • 監視対象の監視につかうMIBファイル

注意事項

重要:以下の作業を実働中の業務環境/顧客環境/その他停止・障害が基本的に許されない本番環境で実施しないで下さい。
この作業では、実際の監視対象機器に対して試験的に大量のSNMP要求を送ったり、それによって大量のDiscoveryリクエスト/pollリクエストをZabbixが抱える作業を実施します。
そのため、最悪の場合、

  • 監視対象機器の停止、遅延、他の監視項目の監視不可
  • Zabbix Serverの停止、遅延、負荷の上昇
  • これらに起因する様々な問題

が発生する場合があります。必ず別途テスト環境を用意して実施して下さい。
自宅鯖だったり、少人数で運用していてかつミッションクリティカルで無い場合は、問題ないことを確認した上でご自身の判断で実施して下さい。

SNMP環境の整備

テンプレートを作成するためにはMIBをOID形式ではなくアイテム名で認識できる必要があるため、また必要な拡張MIBを認識させるため、以下作業を実施します。

1. パッケージのインストール
  • snmp: snmp関連のコマンドを格納したパッケージ
  • snmp-mibs-downloader: 標準MIBを初めとした代表的なMIBを格納している
# apt install snmp snmp-mibs-downloader
2. 標準のMIBファイルの修正/拡張MIBの読み込み設定

snmp-mibs-downloaderで投入したMIBファイルには一部不具合があるため*1修正します。
MIBファイルは /usr/share/snmp/mibs/ にダウンロードされています。

# wget http://www.iana.org/assignments/ianaippmmetricsregistry-mib/ianaippmmetricsregistry-mib -O /usr/share/snmp/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
# wget http://pastebin.com/raw.php?i=p3QyuXzZ -O  /usr/share/snmp/mibs/ietf/SNMPv2-PDU
# wget http://pastebin.com/raw.php?i=gG7j8nyk -O /usr/share/snmp/mibs/ietf/IPATM-IPMC-MIB

完了後、今後追加される新しいMIBを読み込めるよう、設定を変更します。

--- /etc/snmp/snmp.conf.orig    2021-05-09 12:53:06.458047027 +0000
+++ /etc/snmp/snmp.conf 2021-05-07 05:50:17.757122586 +0000
@@ -1,7 +1,7 @@
 # As the snmp packages come without MIB files due to license reasons, loading
 # of MIBs is disabled by default. If you added the MIBs you can reenable
 # loading them by commenting out the following line.
-mibs:
+mibs all

 # If you want to globally change where snmp libraries, commands and daemons
 # look for MIBS, change the line below. Note you can set this for individual
3. 拡張MIBの投入

監視したいベンダ/端末の拡張MIBを投入します。ベンダによっては機種毎にMIBが違うこともあるので注意。
保存場所は /usr/share/snmp/mibs/ ですが、もし大量にある場合(依存関係にあるMIBファイルがなく)一回で動かない場合もあるので ~/.snmp/mibs に置くと、万が一の時に標準のMIBを消さずに済みます*2(n敗)。
投入後は、試しにその拡張MIBを含むOIDで snmptranslate コマンドを実行して、動作を確認します。
ここでは試しに、1.3.6.1.4.1.1182.2.3.9.1 を確認します。

$ snmptranslate .1.3.6.1.4.1.1182.2.3.9.1
YAMAHA-RT-INTERFACES::yrIfPpEntry

もしYAMAHAのMIBを適用した場合、このように出てきたら準備完了です。なお、以下のように表示された場合はMIBが読み込まれていません。

$ snmptranslate .1.3.6.1.4.1.1182.2.3.9.1
iso.3.6.1.4.1.1182.2.3.9.1

また、表示される前に何らかのエラーが出ている場合、必要なMIBファイルが揃っていない可能性があります。その場合、何のMIBがないか表示されますので、そのMIBで検索するとMIBファイルが見つかります。

ここまで完了したら、使用するMIBファイルを /usr/share/snmp/mibs/ に移動しましょう。
これで準備完了です。

mib2zabbixの使い方

では、mib2zabbixを使ってZabbix Templateのたたき台を作っていきます。
ホームディレクトリに戻りましたら、mib2zabbixをダウンロードします。

# apt install perl libxml-simple-perl libsnmp-perl
$ git clone https://github.com/cavaliercoder/mib2zabbix
$ cd mib2zabbix

ダウンロード完了したら、あとはmib2zabbixを実行するのみです。今回必要とするZabbix Templateの範囲のMIBのOIDを確認します。
例えば、YAMAHAのMIBは 1.3.6.1.4.1.1182(YAMAHA-SMI::yamaha) ですが、ルータのMIBだけで良ければ .1.3.6.1.4.1.1182.2(YAMAHA-SMI::yamahaRT) があれば充分です。
さて、今回の例では .1.3.6.1.4.1.1182.2 のZabbix Templateを作るとすると、以下の通りになります。

$ snmptranslate -Tz | mib2zabbix -o .1.3.6.1.4.1.1182.2 -f template-yamaha-RT-mibs.xml -N Yamaha-Router-MIB -e

それぞれ

  • -o: 対象のOIDのルート(一番上)を指定
  • -f: 出力ファイル名
  • -N: テンプレートの(Zabbix上での)表示名(※Zabbix上で変えれるので仮のもので良い)
  • -e: 全ての監視項目を有効化

となります。 -e については、付けないと大量の項目を一個一個クリックして有効化する羽目になるので、最初は全部有効にすることをおすすめします。

監視項目の選別

無事Zabbixテンプレートが出力されたら、実際にZabbixにTemplateとして登録し(テンプレート名も修正し)、ホストに適用します。
この際、注意事項として bulkリクエスト は基本的に無効にした方が良いです。
大量のbulkリクエストは監視対象機器のCPU負荷を上昇したり、そもそもSNMP要求が溜まって拒否されることがあります。

実際に適用すると、

  • 不要な監視項目(802.1Xを使っていないのにそれ関連の監視項目がある、など)
  • 取得不能な監視項目(オブジェクトが存在しない、と言われるもの)
    • これに関しては一時的な不具合である可能性もあるため、一旦ホストを無効にし要求を落ち着けた後、Zabbix Serverからsnmpwalkを使って要求を飛ばしてみると良いです。これでも取得出来ない場合は多分その項目は存在しません。
      • 例:RTX810は yrhInboxTemperature (.1.3.6.1.4.1.1182.2.1.15.0) は取得出来ません。 RTX1210では取得出来ます。
  • 不要ではないものの取得するとZabbix Server/監視機器の負荷が高くなるため取得をしない方が良い項目

等が見つかります。これらを /var/log/zabbix/zabbix_server.log や各監視機器のコンソール/Web GUI などを見ながら調整していきます。
正直これが一番面倒でした。

ここまで出来れば晴れてZabbix テンプレートの完成です。

成果物

上記のアレコレの結果出来たのがこの話です。
kokura.hatenadiary.jp

但し、まだまだやることは残っていて、

  • 完全に不要な監視項目を排除出来たわけではない
  • 監視項目の名前がMIBのアイテム名のままで可読性が低い

等々、今後も修正していきますのでよろしくお願いします。

おまけ

実際に監視項目の選別の際、何度もRTX1210のCPU使用率を100%に張り付かせたり、Zabbix Serverの負荷が大惨事になったりしました。
実はそれまでZabbix Server は「監視鯖だからそんなにスペックいらないよね」とCore2 Duoとかいう化石を使ってたのですが流石に厳しくなり、NECのExpress5800を導入するに至りました。
石も1個しか置いてないしメモリも4GBだけですが、クロックも高くコア数も倍、何よりバスの速度が速い(あとディスクもSASなのでレイテンシが低い)のでだいぶ楽になりました。

また、監視対象が増えるとZabbixやMySQLも標準の設定でやっていくのがだいぶ厳しくなってきます。
私は以下のように設定して今の所どうにかしています。

  • MySQL: innodb_buffer_pool_size=2048M を設定に追加(innodbのバッファを2GBに増やした)
  • Zabbix Server: 色々な監視プロセスを標準より増やしたり、キャッシュサイズを増やしたりした
    • StartPollers=10
    • StartIPMIPollers=3
    • StartDiscoverers=4
    • CacheSize=512M
    • Timeout=10

Zabbixのプロセス数の調整は、実際に自分のサーバでは何のリソースが足りないかを見て調整することになります。Zabbix Serverの監視項目や発生した障害を見ながら調整すると少し幸せになれるかもしれません。


それはそうと、Zabbixサーバを立ててからだいぶ経つのにやっと今更NW機器類の監視が出来るようになったってそれZabbixサーバ持ってる意味ある?(宝の持ち腐れ)
実はpatliteもあるんですが活用できて無くて……この辺も活用できるようになったら記事を書きたいですね。

*1:http://ooltcloud.sakura.ne.jp/blog/201712/article_17222239.html

*2:特にCiscoの場合、かなり沢山のMIBが混ざっており、必ずと言って良いほどエラーが起きますので最初は分離した方がいいです。