munin-limit の不満点!

muninで値が閾値を超えたときにメールを送信してくれる munin-limit って機能なんですが、俺は超不満があります。
主な不満点は次の2つ。

・設定が面倒。わかりづらい。グラフはあんなに簡単なのに!
・メール送信機能がしょぼい。

設定が面倒

すべてテキストエディターで手書きしないといけないから超大変です。
グラフのお手軽さからしてみれば信じられないぐらい面倒だし苦痛です。

samba の swatみたいなツールが出ないもんかと思ったり。
webサービスでこいつをジェネレートしてくれるやつでもいいよね。
ただし、リモートだとどんなプラグインが入っているかわからないから汎用的なやつは無理かも?
まー、これについてはとりあえずおいとこう。本題は次、

メール送信機能がしょぼい。

munin-limit には、メールを送信してくれる機能があるけど、これだけでは不満です。
異常が起きたときに動作しているプロセス一覧とかのスナップショットが見たいんです。

たとえば、プログラムが暴走したとします。
暴走したプログラムがmalloc呼びまくりでメモリをがんがん消費したとします。
するとswapが発生しスラッシング状態になります。
そうなると、load average は急上昇して、muninはそれを検地してメールを送ってくれます。
ここまでいい。だが、それだけではまだダメなんです。

その後、暴走したプログラムはメモリ確保しすぎとかでOSによって殺されます。
そしたら、メモリは開放されてもとの静穏な状態に戻ってしまいます。
管理者がmuninの通知を見てあわててサーバにログインしたときには、平穏に戻っているかもしれません。
oop-killer とかだとログが残るからまだいいんですが、そうではない殺され方をされたらいったいなぜ?
と、首をかしげることになってしまいます。

プログラムのデバッグとおんなじですが、問題が起こったその瞬間は大変貴重です。
「なぜ」問題がおきたのかを知る重要な手かがりになるからです。

プログラムが core や MiniDump を吐くように、サーバにも coreを吐かせたいんです。

とりあえず、以下の情報をアラートメールに添付したい。
ps aux
free
df -h
cat /var/log/message/
dmesg

だけど、muninではそれができません。

いや、一応、設定をすれば送ることはできるんですが、
それは自分のサーバの情報だけなんです。

munin-limit のメール本文に ps の結果をいれる方法は↓以下のページが参考になります。
2007/09/27、munin、munin-limits でメール通知


たとえば、監視サーバが↓のような監視をしていたとして、、、

監視サーバ → サーバA サーバB サーバC(障害発生!)

サーバC で障害がおきたとします。
だけど、そのときメールを送信するのは、監視サーバだから、そこに書かれる情報は監視サーバのものだけです。
障害がおきたサーバはCなんだから、サーバCの情報をつけんでどーする。

まー ssh でかぎ交換してノンパスで入れるようにしといて、
メール送信バッチから ssh user@serverC ps aux とかやればいいんでしょうが、
なんか面倒ですよね。

何で、munin-node経由でこんな情報を取得することができないんだろうと考えちゃいます。
munin-node ってアクセスするIPが簡単に制限できるし、 ssh でかぎ交換するよりセキュアだと思うんですよ。
それに、 /var/log/message とか root ではないと見れないファイルとかもあるぢゃん。
セキュアに運用しようとなると、それらを見れるグループを作って そのユーザの sshキーを交換してとか面倒な設定がいろいろ必要です。
私たちはそんな面倒ことをするために生きているわけでない。もって楽をしたい!

ってわけで、実装仕様検討。

任意のコマンドをリモートから発行できるなんて危険極まりないので、あらかじめ実行できるコマンドを絞るのが基本ですよね。

exec_remote_command_? ってのを定義してあらかじめ実行してほしいコマンドを並べる。

/etc/munin/munin-node.conf
exec_remote_command_1 ps aux ; free ; df -h ; dmesg ; tail --lines 2000 /var/log/message
exec_remote_command_2 ps aux
.[skip]
exec_remote_command_9 df -h ;


んで、監視サーバから nodeに接続するとき、 exec_remote_command 1 とか発行すると、
exec_remote_command_1 が実行されて結果が返ってくるとかどうよ。
このコマンド郡は異常事態が発生しないと送信されないからシステムの負荷とかないだろうし。

セキュリティも問題ないだろう。
まず、実行するコマンドをあらかじめ絞っているため、意図しないコマンドが発行されることはない。
次に、上で書いたとおり、munin-node にアクセスするには、IP範囲を書かなければならない。
それにそれ以上の情報を日々受け取っているわけだ。CPU使用率とか負荷とか、いろいろとね。
だったら、いまさら機密情報が増えたところで問題ないじゃん。

これがやばいんだったら、ssh の方がもっとフリーダムに何でもできるから、もっとやばいわーって感じ。

なんか応用すれば、munin-node を利用した遠隔リブートも可能になる気がするけど、それは邪道というものだ。
素直にsshでログインして su - して rebootしましょう。


で、実装は、、、またこんどね!(www