Custom Object Variablesを使った監視設定の記述メモ


Nagios/IcingaでCustom Object Variablesを使うと、固有の変数を定義する事が出来ます。
これをうまく使うと、監視設定の記述が少しシンプルに記述できるかも、という話です。

IPアドレスを複数持つホストの監視設定


複数IPアドレスを持つホストの監視は結構悩ましいと思います。
例えば、以下のようなホストを監視するとします。

  • HostA → eth0:192.168.0.10, eth1:192.168.1.10
  • HostB → eth0:192.168.0.20, eth1:192.168.1.20


これをCustom Object Variablesを使う、使わないで書き分けてみる事にします。


今回メモの前提として、以下のようにcheck_pingコマンドを定義しています。

define command{
        command_name    check_ping
        command_line    $USER1$/check_ping -H $ARG1$ -w "$ARG2$" -c "$ARG3$" -t $ARG4$ -p $ARG5$
}

Custom Object Variablesを使わない場合


ホスト定義をします。同じ名前でホスト定義は出来ないので、ホスト名-ethX(Xは数字)とします。

define host{
        use             linux-generic-host
        host_name       HostA-eth0
        alias           HostA-eth0
        address         192.168.0.10
        }
define host{
        use             linux-generic-host
        host_name       HostA-eth1
        alias           HostA-eth1
        address         192.168.1.10
        }
define host{
        use             linux-generic-host
        host_name       HostB-eth0
        alias           HostB-eth0
        address         192.168.0.20
        }
define host{
        use             linux-generic-host
        host_name       HostB-eth1
        alias           HostB-eth1
        address         192.168.1.20
        }


次にサービス定義をします。

define service{
        use                     linux-generic-service
        host_name               HostA-eth0
        service_description     ICMP:eth0
        check_command           check_ping!$HOSTADDRESS$!3000.0,100%!5000.0,100%!10!5
}
define service{
        use                     linux-generic-service
        host_name               HostA-eth1
        service_description     ICMP:eth1
        check_command           check_ping!$HOSTADDRESS$!3000.0,100%!5000.0,100%!10!5
}
define service{
        use                     linux-generic-service
        host_name               HostB-eth0
        service_description     ICMP:eth0
        check_command           check_ping!$HOSTADDRESS$!3000.0,100%!5000.0,100%!10!5
}
define service{
        use                     linux-generic-service
        host_name               HostB-eth1
        service_description     ICMP:eth1
        check_command           check_ping!$HOSTADDRESS$!3000.0,100%!5000.0,100%!10!5
}


監視は出来ます。が、同じホストにも関わらず監視設定上別のホストとみなされ、管理上嫌な感じです。
またホストが増えれば増えるほどホスト毎の記述が増えるので、管理負荷が上がってしまいます。

Custom Object Variablesを使った監視設定


次に同じ監視をCustom Object Variablesを使って記述してみます。


まずはホスト定義です

define host{
        use             linux-generic-host
        host_name       HostA
        alias           HostA
        address         192.168.0.10
        _ETH1           192.168.1.10
        }
define host{
        use             linux-generic-host
        host_name       HostB
        alias           HostB
        address         192.168.0.20
        _ETH1           192.168.1.20
        }


「_ETH1」というCustome Object Variablesを定義して、これにeth1のIPアドレスを定義します。
先頭に"_"を入れておく事、全て英語大文字で記述しておくのが重要です。


次にサービス定義です。

define service{
        use                     linux-generic-service
        host_name               HostA, HostB
        service_description     ICMP:eth0
        check_command           check_ping!$HOSTADDRESS$!3000.0,100%!5000.0,100%!10!5
}
define service{
        use                     linux-generic-service
        host_name               HostA, HostB
        service_description     ICMP:eth1
        check_command           check_ping!$_HOSTETH1$!3000.0,100%!5000.0,100%!10!5
}


「_HOSTETH1」という形で定義したCustom Object Variablesを呼び出します。
そうすると、ホスト定義で設定した「_ETH1」の値がコマンドの引数として使われます。

記述の比較


同じ監視設定をCustom Object Variablesを使わない場合、使った場合で書き分けてみました。
Custom Object Variablesを使うと、ホスト定義としてeth0とeth1のICMP監視を設定する事ができ、
管理上の見通しが良くなりました。


また、コンフィグの記述量もCustom Object Variablesを使わない場合と比較して、
半分になっている事が分かります。


コンフィグの記述量の差は、監視する機器数が増えれば増えるほど負荷軽減につながりますし、
記述ミスの減少にもつながるかと思います。


IPアドレス情報をホスト定義にまとめておけるため、チェックも楽かと思います。

おまけ

今回はやりませんでしたが、応用するとプロセス監視のパスやポート監視のポート設定、
リソース監視の閾値をホスト別に定義出来たりもするかと。(今度やってみようと思います)


Custom Object Variables をもっと使って、綺麗なコンフィグを目指していこうと思います。


今日はこんなところで。