Perl版serf-muninを書いた

#serf #perl

zenbutsuさんのserf-munin12、glidenote先生の改造版3があり、3番煎じは流石の薄味ですが、Perlでserf-muninのイベントハンドラを書いてみました。

実はまともにperlのスクリプトを書くのはこれが2回目です。1回目は1.5年くらい前に書いた雑過ぎる席替えスクリプト4です。 あと、こちらのserf-munin.plは30days Album5のバックエンドでひっそりと動いてもらっています。

基本的な動作はzenbutsuさん、glidenote先生のものと同じですが、若干の仕様変更を加えています。 設定方法そのものは公式ドキュメントをご参考ください。

$roleじゃなくてmunin_groupという$tagsを使う

$tagsの中にmunin_groupというタグを用意し、そこにmuninのグループ名を登録するようにしています。
例えば次のように、munin_group=applicationというタグを設定します。

{
 "tags": {
   "munin_group": "app"
 }
}

すると次のように、名前、アドレス、ロール、タグが\t区切りで、標準入力からイベントハンドラに渡されてくるので、これをmuninのグループ名としています。
(ロール未指定の場合、<role>の中身は空っぽで渡されてくる。)

<name>    <address>       <role>   <tags>
foo.com   192.168.100.1            munin_group=app

AWSのようなクラウド前提だと$roleでも良いような気もするのですが、オンプレだと中々そうもいかず、ロールからは独立したmunin-nodeグループタグを用意することにしました。

munin-nodeのconfigファイルを生成・削除するタイミングの変更

member-updateでもconfigファイルを再生成する

これは単純に、サーバのリプレイス等が発生してIPアドレスが変わる可能性があるからです(言っても、ほぼほぼ無いケースですが)。

member-failedでmuninのconfifファイルを削除しない

一時的な負荷等で障害が発生した時は、serf同士の通信もうまく行かずにfailedしてしまいます。

その時にserf-muninがmember-failedの通知を受け取ってconfigファイルを削除してしまうと、しばらくしてmuninから該当サーバの項目が削除されてしまいます。 障害発生前のサーバの様子も確認したいので、明示的にサーバから離れるmember-leaveの時だけconfigファイルを削除するようにしています。

それ以外の挙動は同じです。よいserf x muninライフを!