Nagiosで温度監視

空調整備の業者が間違えてサーバ室の空調を6時間にわたって止めてしまったので、商用サービスを行っているサーバがオーバーヒートでシャットダウンしてしまったということがありました。どうやらサーバ室の温度は40℃以上に達していたようです。幸い(じゃないけど)ほとんど使われていないサービスだったので実害はありませんでしたが本来なら損害賠償ものです。
「なんとかしてよ」というお達しがあったので、サーバ室の温度監視をすることにしました。サーバの監視にはNagiosを使っていたので、何らかの方法でサーバ室の温度を取得しNagiosで監視できると都合がよいと考えました。NagiosLinuxサーバで動かしているので、Linuxで使えるMedia Lab.社のUSB温度計を使用することにしました。

Nagios
Media Lab. USB温度計

付属CDにWindows用とLinux用のサンプルプログラムとソースコードが添付されておりすぐに使うことができます。
添付のusbtestというプログラムをusbtempとリネームして/usr/local/binに置いて実行してみました。実行するにはroot権限が必要なようです。

# usbtemp
31.562500

プログラムを実行すると温度が表示されます。私の環境では実際の温度より5℃ほど高い数値になっているようでした。
この数値をNagiosから監視できるようにしたいと思います。すでにNagiosとnrpeが動作しているものとします。
温度を取得するためのプラグインスクリプトを作成します。温度を補正するためにコマンドから取得した値から5℃引いています。

nagios/libexec/check_usbtemp
                                                                                                                                              • -
#!/usr/bin/perl # Nagios Plugin for usbtemp use strict; use warnings; use Getopt::Long qw(:config gnu_getopt); use lib '/usr/local/nagios/libexec'; use utils; my $offset = -5; sub usage { print STDERR < \$help, 'w=s' => \$warning, 'c=s' => \$critical, ) or usage() ; usage() if $help; usage() if !$warning || !$critical; $usbtemp = `/usr/local/bin/usbtemp`; chomp $usbtemp; if (!$usbtemp || $usbtemp !~ /^[\d.\-]+$/) { $mes = "USBTEMP UNKNOWN - "; $retval = $utils::ERRORS{UNKNOWN}; } else { $usbtemp = sprintf "%d", $usbtemp + $offset; if ($usbtemp >= $critical) { $mes = "USBTEMP CRITICAL - "; $retval = $utils::ERRORS{CRITICAL}; } elsif ($usbtemp >= $warning) { $mes = "USBTEMP WARNING - "; $retval = $utils::ERRORS{WARNING}; } else { $mes = "USBTEMP OK - "; $retval = $utils::ERRORS{OK}; } } $mes .= "${usbtemp} C|"; $mes .= "usbtemp=${usbtemp};$warning;$critical;0;100\n"; print $mes; exit $retval; }

設定ファイルに設定を追記します。環境によって設定ファイルの構成が全く違うと思いますので適宜読み替えてください。

/usr/local/nagios/etc/nrpe.cfg に追記
                                                                                                                                              • -
command[check_usbtemp]=/usr/bin/sudo /usr/local/nagios/libexec/check_usbtemp -w $ARG1$ -c $ARG2$
/usr/local/nagios/etc/services.cfg に追記
                                                                                                                                              • -
#rUSBTEMP define service{ use generic-service host_name hostname service_description rUSBTEMP check_command check_nrpe!check_usbtemp!-a 30 35 process_perf_data 1 }

これでサーバ室の温度が閾値を超過するとNagiosから警告が届くようになります。警告が届いたらサーバ室の扉を開放したり扇風機を運び込んだりすることになります。
Nagiosプラグインさえ作ればあらゆるものを監視できます。プラグインはCでもPerlでもシェルスクリプトでもなんでも作れるので柔軟性が高いです。書籍も発売され日本語の情報も充実してきています。手軽にデータセンタレベルの監視システムを構築したいシステム管理者の方には一押しです。

Nagios 2.0オープンソースではじめるシステム&ネットワーク監視

Nagios 2.0オープンソースではじめるシステム&ネットワーク監視