サーバの稼働状態ってのは、離れていても気になるもの。出来ることならば、動作履歴などをとっておいて、どんな具合で動いていたかを見ておきたいもんですよね。ちなみに、世間一般的には、SNMP*1なんてものがあったりします。これは、ある機器が、SNMPに対応していれば、ですが、MIBと呼ばれるオブジェクトを、SNMPプロトコルをつかって呼び出すと、そのマシンの状態を読むことができたり、設定を変更したりすることができるプロトコルです。で、機器側に乗っている、SNMPで問い合わせられる側をSNMPエージェント、SNMPで問い合せてくる側をSNMPマネージャといいます。
SNMPのMIBは、RFCなんかで定義されているので、普通はあるMIBオブジェクトは、こういう属性の数値が取れるMIB、てのが決まってます。この機器は、XX MIBに対応してるとしておけば、XX MIBの情報が必ず取れる。で、SNMPマネージャ側は、データを取得してなんらか加工した上で表示とかしてやればいいわけです。SNMPマネージャも、XX MIBに対応してます、というマネージャさえ使えば、どんなんでもOK。
さて、その前準備として、SNMPエージェント側の設定をしてまいります。
これには、/etc/snmp/snmpd.confを編集いたします。snmpd.confの設定にはある段階があります。まず最低限の設定項目はこいつら。
# ラベル ホスト名(IPアドレス) コミュニティ名 com2sec local localhost local # グループ名 プロトコル(この例はSNMPv2c ラベル group MyROGroup v2c local # 全てのMIBにアクセス出来る設定 view all included .1 80 # グループ名 ?? ?? 認証 ?? 読み 書き ?? access MyROGroup "" any noauth exact all none none #どこにあるか識別名を書いておく syslocation anywhere #管理者名とかの識別名を書いておく syscontact foovar <foovar@anywhere.jp>
ここまで書いて
# /etc/init.d/snmpd start
すると、Linuxで取得できるMIBがGet出来たりします。こんな感じ
# snmpwalk -v 2c -c local localhost system SNMPv2-MIB::sysDescr.0 = STRING: Linux someHost 2.6.XX #1 XXXXXX SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10 DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (18562973) 2 days, 3:33:49.73 SNMPv2-MIB::sysContact.0 = STRING: foovar <foovar@anywhere.jp> SNMPv2-MIB::sysName.0 = STRING: someHostname SNMPv2-MIB::sysLocation.0 = STRING: anywhere . . .
まず、lm_sensorsとかをインストールして、サーバの情報が取れるようにしてみてね。ここ参照。で、さらにCPU温度取得するシェルをつくってみます。ここまで良いでしょうかね。 このシェルを実行してみると、まんま温度が表示されます。さて、ここで、snmpd.confを編集します。
exec cputemp /usr/local/bin/cputemp.pl
こんな行追加。でsnmpd再起動。そうすると…あるMIBをgetすると、このシェルを実行してくれるようになるのですよ。
# snmpwalk -v 2c -c local localhost .1.3.6.1.4.1.2021.8 UCD-SNMP-MIB::extIndex.1 = INTEGER: 1 UCD-SNMP-MIB::extNames.1 = STRING: cputemp UCD-SNMP-MIB::extCommand.1 = STRING: /usr/local/bin/cputemp.pl UCD-SNMP-MIB::extResult.1 = INTEGER: 0 UCD-SNMP-MIB::extOutput.1 = STRING: 35 ←これが温度 UCD-SNMP-MIB::extErrFix.1 = INTEGER: noError(0) UCD-SNMP-MIB::extErrFixCmd.1 = STRING:
ね。なかなか面白いでしょう。
今度は、smartmontoolをインストールして、サーバの情報が取れるようにしてみてね。ここ参照。さらにHDD温度取得するシェルをつくってみます。このシェルに、引数として、温度を取得したいHDDデバイス名(/dev/sdaとか)を指定すると、指定したHDDデバイスの温度が取得できます。 で、同じようにsnmpd.confに追加する。
exec hddtemp /usr/local/bin/hddtemp.pl /dev/sda
で、snmpd再起動。するってと
# snmpwalk -v 2c -c local localhost .1.3.6.1.4.1.2021.8.1.101 UCD-SNMP-MIB::extOutput.1 = STRING: 35 ←さっきのCPU温度 UCD-SNMP-MIB::extOutput.2 = STRING: 39 ←追加したHDD温度
というようにHDDの温度も取得できましたね。
こんなふうに、外部コマンド実行もできます。また、HDDの容量がある設定値を超えたらアラームとか、指定したプロセスがいるかを監視するとか、loadaverageの設定値を超えたらアラームなど、いろいろと機能があります。必要に応じて設定してみてくださいね~