以前、ESXi で snmp を有効にする方法を調べて設定したものの、ハードウェアイベントに関しては snmp から状態を監視することができなかったので、今日は snmptrapd を使ったメール通知に挑戦してみました。ESXi から直接イベント通知メールを送ることはできないので、別途 net-snmp がインストールされた CentOS の snmptrapd を使うことになります。
以下、設定メモ。
† snmptrapdの設定をする
ESXi側の設定を変える前に通知サーバーの準備をします。
これはESXi側の設定を変更すると、作業の都合上 snmptrap が発生するため、それで動作テストを済ますことができるためです。
必要となるnet-snmpのインストールについては割愛しますが、yumを使えば一撃かと思います。
外部からの snmptrap を受信できるように下記のように設定を変更しておきます。
# diff -u snmptrapd.options.org snmptrapd.options
--- snmptrapd.options.org 2011-01-22 22:00:00.000000000 +0900
+++ snmptrapd.options 2011-01-22 22:00:00.000000000 +0900
@@ -1,2 +1,2 @@
# snmptrapd command line options
-# OPTIONS="-Lsd -p /var/run/snmptrapd.pid"
+OPTIONS="-Lsd -p /var/run/snmptrapd.pid"
メールの送信先を指定するために、設定ファイルに設定を記入します。
なお、デフォルトのインストールだと下記のファイルは存在しないので、新規にファイルを作って中身を書き込みます。
下記の設定は、全ての通知を hsur@example.jp に送信します。また、使うメールサーバを -s で、fromアドレスを -f で設定します。
/etc/snmp/snmptrapd.conf
authCommunity log,execute,net public
traphandle .1 /usr/bin/traptoemail -f snmptrapd@example.jp -s mail.example.jp hsur@example.jp
これでひとまず設定は完了なので、デーモンを起動します。
# /etc/init.d/snmptrapd start
† ESXi側の設定をする
次にESXi側のsnmpの設定を変更して、先ほど立てたsnmptrapdに通知が送られるようにします。
SSHもしくは、端末から直にログインして下記のファイルの<targets>タグの中に(サーバIP)@(コミュニティ名)を記載します。
/etc/vmware/snmp.xml
<config><snmpSettings><enable>true</enable><communities>public</communities><targets>192.168.0.1@public</targets></snmpSettings></config>
その後、サービスを再起動して変更を反映させます。
# /sbin/services.sh restart
サービス再起動の際に snmptrap が発生するので、メールボックスを確認します。
† メールが読めない
通知先のメールボックスにはおそらく下記のようなメールが届いているはずです。
To: hsur@example.jp
From: snmptrapd@example.jp
Subject: trap received from esxi01: SNMPv2-SMI::enterprises.6876.4.1.0.1
Host: esxi01 (UDP: [192.168.0.100]:60157)
DISMAN-EVENT-MIB::sysUpTimeInstance 0:0:00:01.29
SNMPv2-MIB::snmpTrapOID.0 SNMPv2-SMI::enterprises.6876.4.1.0.1
SNMPv2-SMI::enterprises.6876.50.101 80
SNMPv2-SMI::enterprises.6876.50.102 "/vmfs/volumes/########-########-####-############/examplevm/examplevm.vmx"
SNMPv2-SMI::enterprises.6876.2.1.1.2.80 "MoId: 80"
SNMP-COMMUNITY-MIB::snmpTrapAddress.0 192.168.0.100
SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 "public"
SNMPv2-MIB::snmpTrapEnterprise.0 SNMPv2-SMI::enterprises.6876.4.1
この時点ではESXiのMIBがまだインストールされていないので、例えばイベント名が SNMPv2-SMI::enterprises.6876.4.1.0.1 になったりしていて、ホストにどんな変化が起こったのかということがよくわかりません。ということで、今度はこれがメッセージとしてきちんと読めるようにMIBのインストールを行っていきます。
† mibをインストールしてメッセージを読めるようにする
ESXi4用のMIBはVMware ESX 4.0 SNMP MIB Modulesからダウンロードでき(ESXi5の場合は下記を参照)るので、あらかじめダウンロードして通知サーバー上に置いておきます。今回は標準でインストールされているMIBとごっちゃにするのが嫌だったので、 /usr/local/share/snmp/mibs にインストールして、デーモンがそこを参照するように設定することにします。
ディレクトリを作って、アーカイブを展開し、不要なファイルを削除します。
# mkdir -p /usr/local/share/snmp/mibs
# cd /usr/local/share/snmp/mibs
# cp /path/to/VMware-esx-mibs-1.0.1-237711.zip .
# unzip VMware-esx-mibs-1.0.1-237711.zip
# mv esx/* .
# rm -rf esx VMware-esx-mibs-1.0.1-237711.zip notifications.txt README
この時点で、/usr/local/share/snmp/mibs以下には .mib ファイルだけが入っている状態です。
このMIBがsnmptrapdから参照されるように設定を変更します。
# diff -u snmptrapd.options.org snmptrapd.options
--- snmptrapd.options.org 2011-01-22 22:00:00.000000000 +0900
+++ snmptrapd.options 2011-01-22 22:00:00.000000000 +0900
@@ -1,2 +1,2 @@
# snmptrapd command line options
-# OPTIONS="-Lsd -p /var/run/snmptrapd.pid"
+OPTIONS="-Lsd -p /var/run/snmptrapd.pid -m ALL -M +/usr/local/share/snmp/mibs"
設定後、デーモンを再起動しておきます。
# /etc/init.d/snmptrapd restart
† もう一度メールを確認する
テストするためにはもう一度snmptrapを発生させる必要があるので、ESXiに戻ってサービスの再起動を行ってみます。
# /sbin/services.sh restart
そうすると、さっきのメールのコード部分が文字になり意味が分かるようになります。
前述のメールと比べると、例えば SNMPv2-SMI::enterprises.6876.4.1.0.1 → VMWARE-VMINFO-MIB::vmwVmPoweredOn となっているのが分かると思います。
To: hsur@example.jp
From: snmptrapd@example.jp
Subject: trap received from esxi01: VMWARE-VMINFO-MIB::vmwVmPoweredOn
Host: esxi01 (UDP: [192.168.0.100]:60157)
DISMAN-EVENT-MIB::sysUpTimeInstance 0:0:00:01.29
SNMPv2-MIB::snmpTrapOID.0 VMWARE-VMINFO-MIB::vmwVmPoweredOn
VMWARE-VMINFO-MIB::vmwVmID 80
VMWARE-VMINFO-MIB::vmwVmConfigFilePath /vmfs/volumes/########-########-####-############/examplevm/examplevm.vmx
VMWARE-VMINFO-MIB::vmwVmDisplayName.80 MoId: 80
SNMP-COMMUNITY-MIB::snmpTrapAddress.0 192.168.0.100
SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 "public"
SNMPv2-MIB::snmpTrapEnterprise.0 VMWARE-PRODUCTS-MIB::vmwESX
これで設定は完了です。あとは障害があればメールで通知が飛んでくるはずです。
† (おまけ)Windows側からテスト用のTrapを発生させたり、設定を確認する
また、VMware vSphere CLIをインストールしたPCがあれば vicfg-snmp.pl を使ってテスト用のtrap飛ばしたり、設定を確認することもできます。
C:\Program Files\VMware\VMware vSphere CLI\bin>vicfg-snmp.pl -server 192.168.0.100 -username root -T
Enter password:
Sending test nofication(trap) to all configured targets...
Complete. Check with each target to see if trap was received.
C:\Program Files\VMware\VMware vSphere CLI\bin>vicfg-snmp.pl -server 192.168.0.100 -username root -s
Enter password:
Current SNMP agent settings:
Enabled : 1
UDP port : 161
Communities :
public
Notification targets :
192.168.0.1@162/public
† 2011/02/05 追記
上記の設定のままだと死ぬほどメールが送られてきたりするので、必要ないイベントをフィルタするためのスクリプトを書きました。
† 2011/11/01追記
ESXi5のMIBは下記からダウンロードできます。
→VMware vSphere 5.0 SNMP MIBs