monでサーバ監視

Ads

monとは

  • サーバを監視して問題が起きたら適当なアクションを起こすというプログラムです。
  • Perl で書かれており、mon 本体と、モニタスクリプト、アラートスクリプトがセットで配布されています。
  • サーバを監視するためのモニタスクリプトや、サーバに何かあったときに起動されるアラートスクリプトは、自分で簡単に作成出来ます。

インストール

  1. http://www.kernel.org/software/mon/ の ftp よりアーカイブを入手します。
  2. 適当な場所(/usr/local/mon 等)に展開します。
  3. mon は Perl で書かれているので make 等は必要ありません。設定ファイルを書き換えていきなり使えます。
  4. mon は Perl で書かれているので make 等は必要ありませんが、いくつかの Perl パッケージを必要とします。 一度実行してみて必要なパッケージが足りなければインストールします。僕の場合は Mon::SNMP が足りなかったので以下のように CPAN からインストールしました。
    perl -MCPAN -e 'install Mon::SNMP'
  5. /usr/local/mon にインストールしたなら、設定ファイルを /usr/local/mon/etc/mon.cf に作成*1して以下のようにして起動すると良い気がします。
    /usr/local/mon/mon -b /usr/local/mon -B /usr/local/mon/etc

daemontoolsで起動

mon のアーカイブの中に etc/S99mon という init.d 用のスクリプトがあるのでこれを修正して使っても良いですが、 ここでは daemontools を使って起動することにします。

あと、S99mon を使うと root で mon が起動されますが、今回は mon というユーザを作ってそいつの権限で動くようにします。 *2

  1. mon 用ユーザを作る mon は mon プロセス用ユーザ、monlog は multilog によるログ取り用ユーザ
    useradd -s /dev/null -d /dev/null mon
    useradd -s /dev/null -d /dev/null monlog
  2. サービスディレクトリ作成
    mkdir /var/service/mon
    mkdir /var/service/mon/log
    chown monlog.monlog /var/service/mon/log
  3. run スクリプト作成
    • /var/service/mon/run
      #!/bin/sh
      MON=/usr/local/mon
      exec \
      env - PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin \
      "$MON/mon" -b "$MON" -B "$MON/etc" \
      2>&1
      • mon は /usr/local/mon にインストールされているとする。
    • /var/service/mon/log/run
      #!/bin/sh
      exec setuidgid monlog multilog t ./main
  4. サービスを有効にする
    ln -s /var/service/mon/ /service

設定

mon.cf

詳細は後で書く :(

とりあえず今使ってる mon.cf はこんな感じ。

maxprocs = 20
histlength = 100
randstart = 60s

hostgroup myserver server1.example.jp

watch myserver
    service http
        interval 30s
        monitor http.monitor
        allow_empty_group
        period wd {Sun-Sat}
            alertevery 1h
            alertafter 2 30m
            alert mail.alert alert@example.jp
            upalert mail.alert -u alert@example.jp
            alert svc.alert -S dx -D /service/httpd
    service ftp
        interval 10m
        monitor ftp.monitor
        allow_empty_group
        period wd {Sun-Sat}
            alertevery 1h
            alertafter 2 30m
            alert mail.alert alert@example.jp
            upalert mail.alert -u alert@example.jp
    service smtp
        interval 5m
        monitor smtp.monitor
        allow_empty_group
        period wd {Sun-Sat}
            alertevery 1h
            alertafter 2 30m
            alert mail.alert alert@example.jp
            upalert mail.alert -u alert@example.jp
    service pop
        interval 5m
        monitor pop3.monitor
        allow_empty_group
        period wd {Sun-Sat}
            alertevery 1h
            alertafter 2 30m
            alert mail.alert alert@example.jp
            upalert mail.alert -u alert@example.jp

auth.cf

よく分かっていないのが必要なようなのでデフォルトのを使ってる(良くないないぁ・・・)。

TCP と UDP の 2583 ポートを LISTEN する用だが、僕はそれを使わないので iptables で捨てている。

自作モニタスクリプト

デフォルトで必要そうなのは大体揃っているので、今のところ自分で作ったのは無い。

ssh.monitor

SSH の監視がしたくなったので作ってみた(2005-05-22)

ちょいソースが長いのでコピペじゃなくて添付にしておく。

#ref(): File not found: "ssh.monitor" at page "monでサーバ監視"

自作アラートスクリプト

アラートスクリプトの書き方

コマンドの引数
mon はアラートスクリプトを起動するときに getopt("s:g:h:t:l:u") で得られる形でいくつかの情報を渡してくれます。これらオプションの説明は svc.alert スクリプトのソースを見て分かって下さい :D
標準入力
モニタスクリプトが出力したメッセージを標準入力から得ることが出来ます。
標準出力と標準エラー
標準出力に出力した文字列は mon のログになります。

svc.alert

daemontools の svc コマンドを実行するアラートスクリプト。

  • これは httpd の応答が無くなったら、自動で daemontools により起動されている httpd を再起動するために作りました。
  • mon が root 以外で動いている場合は sudoers に以下のような設定を追加して使います。*3
    mon ALL=NOPASSWD:/usr/local/bin/svc
  • alert.d にコピーして使います。
  • いくつか必要のない行がありますが、これは mon が勝手に渡してくれるオプションの意味を自分に分かりやすくしているだけです。 *4

svc.alert のソース

#!/usr/bin/perl
use strict;
use Getopt::Std;

getopts("s:g:h:t:l:u" . "D:S:");

#monが設定するオプション
my $summary      = <STDIN>; chomp $summary;
my $alert        = $Getopt::Std::opt_u ? "UPALERT" : "ALERT";
my $service      = $Getopt::Std::opt_s;
my $hostgroup    = $Getopt::Std::opt_g;
my $hostname     = $Getopt::Std::opt_h;
my $timesec      = $Getopt::Std::opt_t;
my $nextalertsec = $Getopt::Std::opt_l;

#自分用オプション
my $dir      = $Getopt::Std::opt_D;
my $signal   = $Getopt::Std::opt_S;
my $progname = $1 if($0 =~ /([^\/]+)$/);

print "$progname: $hostgroup $hostname svc -$signal $dir\n";
exec "sudo", "svc", "-$signal", $dir
  • mon.cf の alert 行には以下のよう記述します。
    alert svc.alert -S dx -D /service/httpd
    • これはサービスがダウンしたら svc -dx /service/httpd を実行します。

コメント

  • 大変参考になりました。まだmon触りたてだったので、非常に助かります。一つmon.cfの設定で監視期間の分指定が出来ない(?)ことが不便だなぁと思っているのですが、mon -- たけ? 2006-05-31 (水) 14:11:57
  • monの設定のみで監視期間を深夜10分間だけ外すといった事は出来るのでしょうか?現在mon.cfの設定ではこのようになっています。period wd {Sun-Sat} hr {00-03} hr {04-24} -- たけ? 2006-05-31 (水) 14:19:29

*1 設定ファイルの書き方は後述します
*2 root 以外で動かすと当然 root 権限を必要とするモニタスクリプトやアラートスクリプトが正常に動かなくなりますが、その場合、僕は sudoers で必要なコマンドだけ mon が使えるように設定して、スクリプトも sudo を使うように修正して使っています。
*3 もっと締め付けるなら必要な svc のオプションまで書きます。
*4 他のアラートスクリプトを作るときはいつもこれをテンプレートとして作ってます。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-08-14 (月) 15:34:42 (4504d)