5.27.2013

Nagios: Template for Monitoring Log Files

Nagios 3系 ログ監視用のテンプレート

Nagios でログ監視を行う場合、デフォルト設定のままでは意図した動作にならないことがある。
注意点と対策についてメモしておく。

 

環境

 

監視要件

 

  • 5分間隔(以下、インターバルとする)で、サーバ内のあらかじめ設定した任意のログファイル
    (UTF-8エンコーディングのテキストファイル) をチェックする
  • インターバルの間に更新された行について、特定の正規表現パターン(以下、検知文字列とする)
    にマッチする場合、あらかじめ設定した任意のメールアドレスに通知メールを発信する
  • 検知文字列の内容によって WARNING と CRITICAL のレベルを出し分ける
  • 検知文字列が含まれている行であっても、特定の正規表現パターン(以下、監視除外文字列とする)
    とマッチしたら通知は行わない
  • インターバルの間に複数の行が検知された場合でも通知メールは1通だけとする。
    その場合、検知された行全てのテキストをメール本文に含める必要はない
 
問題点
  • デフォルトのプラグイン「check_log」ではレベルの出し分け、監視除外文字列の設定ができない
    =>  check_log3.pl を使えばよい (check_log3.pl - Nagios Exchange)
  • 営業時間外のメッセージが通知されない
    => テンプレート(templates.cfg) の linux-server では、通知時間帯 (notification_period) がデフォルトで
    workhours に設定されている。
    これは timeperiods.cfg に記述されている 月曜〜金曜 9:00-17:00 の時間帯定義であり
    それ以外の時間帯には通知が抑止されてしまう。 
  • Nagios の実行ユーザに、/var/adm/messages などのログファイルの参照権限がない
    => sudo コマンドを介して check_log3.pl を実行する必要がある。
    そのとき、requiretty が設定されていると sudo に失敗してしまう。
  • リトライ回数が指定されている場合、通知が行われない
    => 試行回数 (max_check_attemps) が 2以上に設定されていると、異常を検知した後(デフォルトは1分後)
    に自動的にリトライが行われる。
    リトライが正常終了となれば(ログ監視の場合は大半がこのパターンだろう)、一切の通知は行われない。 
  • 検知文字列が連続したインターバルに出力されたとき、2回目以降が検知されない
    => デフォルトのサービスは異常状態が続いた時は notification_interval の間隔
    (デフォルト1時間)でしか通知が行われない。
    ログ監視の場合はインターバルごとに異常を検知する必要があるので Volatile(=変わりやすい、の意)
    サービスに設定する必要がある。 
  • フラッピング状態となった場合に通知が行われない
    => Nagios 3系では、デフォルトでフラッピング(監視対象の状態が頻繁に変化する状態のときに不要な
    通知を抑止する機能)が有効となっており、正常・異常の状態が頻繁に変わると一定時間
    一切の通知が行われなくなる。
  • 不要な RECOVERY メッセージが通知される
    => サービスで通知される種別のデフォルト (notification_options) は
    WARNING(w), UNKNOWN(u), CRITICAL(c), 復旧状態(r) の4つ。 
    w, u, c のみに変更するとよい。

  

対応策
  • 追加プラグイン check_log3.pl を libexec ディレクトリ以下に配備する
    ファイルに実行パーミッションを付与すること 
  • visodo コマンドを行い、Nagios 実行ユーザに対して適切な権限を追加する
    /etc/sudoers 設定例
    Defaults:nagios !requiretty
    nagios ALL=NOPASSWD:/usr/local/nagios/libexec/check_log3.pl
    
    Nagios によるチェックは TTY でないので、Cronと同様 requiretty を無効化するのがポイント。
  • ログ監視サービス用のテンプレート例 (templates.cfg)
define service{
        use                             local-service
        name                            check-log-service
        is_volatile                     1
        max_check_attemps               1
        flap_detection_enabled          0
        notification_options            w,u,c
        register                        0
        }
  • コマンド定義例 (commands.cfg)
define command{
        command_name    check_log_crit
        command_line    sudo $USER1$/check_log3.pl -l $ARG1$ -s $ARG2$ -p $ARG3$ -c 1 $ARG4$
        }

define command{
        command_name    check_log_warn
        command_line    sudo $USER1$/check_log3.pl -l $ARG1$ -s $ARG2$ -p $ARG3$ $ARG4$
        }

(検知行数ではなく)検知文字列によってレベルを出し分ける場合は、2つのサービスに分けて登録する必要がある。

  • サービス定義例
define service{
        use                             check-log-service
        host_name                       localhost
        service_description             SysLog Warn
        check_command                   check_log_warn!/var/log/messages!/tmp/.messages.warn.seek!warn!-i
        }

"-i" は英大文字・小文字の区別をなくすオプション。(ignore case)

 

 

補足

NRPEを利用してリモートサーバのログを監視する場合、デフォルトの10秒のタイムアウトでは間に合わない場合がある。

check_nrpe コマンドのオプションとしてタイムアウト(-t)を明示的に指定することをお勧めする。

  • コマンド定義例 (タイムアウトを30秒に設定、ARG2 でその他のオプションを設定可能に)
define command{
 command_name check_nrpe
 command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -t 30 $ARG2$
 }

 

check_log3.pl 自体のタイムアウトは

/usr/local/nagios/libexec/utils.pm
の記載内容を引き継いでいるので
タイムアウトを引き延ばす場合は Perl スクリプト側の修正も必要。(デフォルト15秒)

 

References

5.19.2013

Sieve of Eratosthenes in Scala

Scala: エラトステネスのふるい

Stream の使いどころが少しずつ分かってきた。
エラトステネスのふるいがこんな簡潔に書けるのは衝撃的。

  • コード
def from(n: Int): Stream[Int] = n #:: from(n + 1)    // 整数の Stream を作る
def sieve(s: Stream[Int]): Stream[Int] =
  s.head #:: sieve(s.tail.filter(_ % s.head != 0))
sieve(from(2)).take(20).print
  • 出力
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, empty

5.15.2013

Networking in VirtualBox via NAT + Host-only

VirtualBox の NAT 設定

忘れた頃に限って必要に迫られるのでメモ。

環境
  • VirtualBox 4.2.6
  • ホストOS: OS X 10.8
  • ゲストOS: CentOS 6.3 (64bit)

 

設定手順
  • ゲストOSをシャットダウン
  • VirtualBox のGUIで設定
    • まずは全体の設定 -> Network から Host-only ネットワークを追加
      VirtualBox  Network

    • 仮想マシンの Adapter 1 を NAT
      CentOS 6 3  Network 3

    • Adapter 2 を Host-only Adapter に変更
      CentOS 6 3  Network
  • ゲストOSを起動し、CentOS 上でネットワークを設定
    • eth0 は NAT用。DHCPで利用する。
      デフォルトではゲートウェイは 10.0.2.2。DNS は VirtualBox が よしなに設定してくれる。
      • /etc/sysconfig/network-scripts/ifcfg-eth0
         
        DEVICE="eth0"
        BOOTPROTO="dhcp"
        ONBOOT="yes"
    • eth1 は Host-only 接続。
      デフォルトでは 192.168.56.0/24 のネットワークを利用できる。
      ホストOSのインタフェースは .1、.100 がDHCPサーバで .101〜.254 のDHCPクライアントアドレスを払い出す。
      今回は固定アドレス(192.168.56.2)を設定。
      • /etc/sysconfig/network-scripts/ifcfg-eth1
        DEVICE="eth1"
        BOOTPROTO="static"
        ONBOOT="yes"
        IPADDR="192.168.56.2"
        NETMASK="255.255.255.0"
    • デフォルトゲートウェイを設定する。 
      • /etc/sysconfig/network (一部)
        GATEWAY=10.0.2.2
    • サービス再起動。 
       
      # service network restart
  • 最終的なルーティング設定は以下の通り。 
     
    # route
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    10.0.2.0        *               255.255.255.0   U     0      0        0 eth0
    192.168.56.0    *               255.255.255.0   U     0      0        0 eth1
    link-local      *               255.255.0.0     U     1002   0        0 eth0
    link-local      *               255.255.0.0     U     1003   0        0 eth1
    default         10.0.2.2        0.0.0.0         UG    0      0        0 eth0

  

実現できること
  • ゲストOSから外部ネットワークへの通信ができる (ゲストOS -> 10.0.2.x -> 10.0.2.2 -> NAT -> 外部NW)
  • 外部ネットワークからゲストOSへの接続はできない
  • ゲストOSからホストOSへの通信ができる (ホストOS -> 192.168.56.1 -> 192.168.56.x -> ゲストOS)
  • ホストOSからゲストOSへの通信ができる (ゲストOS -> 192.168.56.x -> 192.168.56.1 -> ホストOS)

 

ネットワーク構成図

 NewImage

5.11.2013

The First Tutorial of Emacs

Emacs: 最初のチュートリアル

チュートリアルをやり終えた。

Mac のターミナル上で実行する場合は、ターミナルのオプションで
「Use options as meta key」のチェックを ON にする必要がある。
(ただし、フレームの操作など一部機能は制限されるようだ) 

Settings

 

日本語チュートリアルの起動方法は以下のとおり。

  • Emacs を起動
  • Alt (option, META) + X
    • 拡張コマンドの実行
  • help-with-tutorial-spec-language と入力して <ENTER>
    • ここは help <SPACE> w <TAB><SPACE><TAB> でも補完が効く
  • 言語の選択画面が出るので j <ENTER>

次は Info マニュアルを読むと良いらしい。

  • C-h i
  • ?

Redis: How to Delete Keys by Wildcard

Redis: ワイルドカードを使って複数のキーを削除する方法

keys コマンドの結果を xargs で del コマンドに渡せばよい。
redis-cliプロンプトの内部ではなく、シェル上で実行するのがポイント。 

$ redis-cli keys 'prefix*' | xargs redis-cli del

5.07.2013

Getting Started with Emacs on Mac

Mac: Emacs のインストール

これまではVim一辺倒だったけど、IDE周りで微妙なストレスを感じることが増えたので
Emacs派への改宗を検討中。

まずは Mac へインストール。

コマンドライン版はデフォルトで入っているようだが、練習がてらGUI版をインストール。

  • 最初はここからパッケージをインストールするも、なぜか起動せず。
    http://emacsformacosx.com/ 
  • 結局 Homebrew 経由で最新版(24.3)をインストール。
    $ brew install emacs --cocoa
  • インストール後、Applications 配下にシンボリックリンクを張って無事起動。
    $ ln -s /usr/local/Cellar/emacs/24.3/Emacs.app /Applications/Emacs.app
     

GNU Emacs

幸せな Emacs ライフを送れますように。

 

追記 (2013-05-08)

シンボリックリンク作成の手順は以下のように brew コマンドでも可能。

$ mkdir ~/Applications
$ brew linkapps