Presented by DMZ. (非武装エリア)
最終更新日: 2021年11月14日
(This site is not official.)

Topに戻る

スクリプトを使った監視

監視したいサービス用のテンプレートが存在しない場合には、新たにそのサービスを監視するための方法が必要となります。 特にUDP通信を行う ntpサーバやDNSサーバでは、TCPコネクションを使った通信でないためZabbixの標準で持つTCPポートのコネクションを確認する方法での監視ができません。このようなサービスの状態を監視するには次のような方法が考えられます。
  1. 対象のサービスと通信するソフトを使って確認する。
  2. 対象のサービスが動作している事を確認する。
  3. SNMPでサービス情報を取得する
c. については、SNMPに関する資料を確認してみてください。
a. の方法は、実際に監視したいサービスが機能しているかを調べるの確実な監視が可能です。
b. の方法は、機能が正常かどうかまでは調べませんが、監視サービスのプログラムが稼働しているかを判断するのに役立ちます。

機能が正常に動作するか確認する場合

監視対象のサービスが正常に機能しているかを調べるには、そのサービスを実際に使うコマンドを利用する方法での確認が考えられます。例えばNTPサーバーとの通信にはntpdateコマンド、DNSサーバーの確認にはnslookupコマンドを使う事が可能です。 Zabbixではこれらのコマンドをスクリプトを使って実行する事で、サービスが正常に機能しているかをチェックできます。
この時、これらのスクリプトを実行するのがZabbixサーバーなのか監視対象ホスト上なのかによって設定方法が違ってきます。
また、それぞれの方法では以下のように動作の違いがあります。
■ Zabbixサーバー側でスクリプトを実行する場合:
■ 監視対象側でスクリプトを実行する場合:
これらの違いを踏まえ、最適な方法で監視を行う必要があります。
  1. Zabbixサーバー側でスクリプトを実行する場合の設定
  1. 監視対象ホスト側でコマンドを実行する場合の設定

サービスが動作している事を確認する場合

Windwsではservice.info[]というキーを使うことで、監視対象のホスト上でサービス(プロセス)が正常に動作しているかを確認でできます。 このキーはLinuxでは利用できない為、上の「監視対象ホスト側でコマンドを実行する」の方法と同じように監視対象ホストでスクリプトを使って判断します。
  1. Linux(Unix)におけるプロセスの確認方法のおさらい
Linuxではサービス(プロセス)を起動する際に、現在すでにそのサービスが稼働中で2重実行にならないかをサービス起動時にチェックする仕組みを取っています。
また、この情報はサービスのステータスを確認することで容易に知ることができます。 試しに、Linux上で次のコマンドを実行してみてください。

# systemctl --no-pager status ntp
● ntp.service - LSB: Start NTP daemon
    Loaded: loaded (/etc/init.d/ntp; generated; vendor preset: enabled)
    Active: active (running) since Wed 2021-11-10 06:29:42 JST; 4 days ago
    Docs: man:systemd-sysv-generator(8)
    Process: 37902 ExecStop=/etc/init.d/ntp stop (code=exited, status=0/SUCCESS)
    Process: 37922 ExecStart=/etc/init.d/ntp start (code=exited, status=0/SUCCESS)
    Tasks: 2 (limit: 9830)
    CGroup: /system.slice/ntp.service
                └─37932 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 108:113

NTPサーバが稼働中であれば Active: の値が"active (running)"に、そうでない場合には"inactive (dead)"となっていると思います。 このコマンドは、内部的には"ps"でのプロセス確認と同じ事を実施して、NTPサービスが既に起動しているかを確認します。 このコマンドを実施したとき、コマンドの戻り値として稼働中の場合には"0"を、停止中の時には"0"以外の値を返してきます。これを利用してプロセスが起動中かそうでないかを確認する事が可能です。
  1. プロセス稼働の確認方法
上で説明したとおり、あるプロセスが稼働中かどうかを調べる方法が存在すればそれを使ってZabbixで監視アイテムを作ることが可能です。 まず、最初に監視対象のホスト上で次のようなスクリプト(check_process_ntp.sh)を作成します。 このスクリプトは、NTPサービスのプロセスを確認して、プロセスが起動されていれば"0"を、そうでなければ"0以外"を表示するようになっています。

(/usr/local/check_process_ntp.sh)

#!/bin/sh
# ---------------------------------
# check_process_ntp.sh
# NTPd running status checker.
# Return Status: = 0 (Runnning)
# != 0 (not Running)
# ---------------------------------
ret=0
/bin/systemctl --no-pager status ntp >/dev/null || ret=$?
echo $ret

作ったスクリプトは実行権を与えるために次のコマンドを実行します。

# chmod +x /usr/local/bin/check_process_ntp.sh

監視対象のホスト側でスクリプトが完成したら、今度はZabbixサーバ側での設定を行っていきます。 
「設定」-「ホスト」で、対象とするサーバを選択します。 選択したサーバの「アイテム」をクリックします。画面右の「アイテムの作成」をクリックします。
以下のように指定します。
登録の前にこのスクリプトのテストを行うために、[テスト] をクリックします。
[値の取得とテスト]をクリックすると監視対象ホストでスクリプトが実行されてそのステータスが"値"に返ってきます。
テストができたら最後に[追加]をクリックしてアイテムの登録を行います。
これで監視アイテムの作成は完了です。 続いて、この監視アイテムに対するトリガー(イベント)を設定します。
[設定] - [ホスト] から監視対象のサーバーの [トリガー] を選択します。 画面右上の [トリガーの作成] をクリックします。
トリガーを次にように作成ししていきます。
(1) まず、NTPサービスに障害が発生したと判断するトリガーを作成します。
条件式として判定に使うアイテムと、その判定基準を定義します。 ここでは"check running NTP"というアイテムが0以外だった場合に障害と判定します。
条件式を指定できたら、[追加]をクリックしてトリガーを登録します。 以上で、NTPサービスに問題がある場合にこのトリガーが"重度の障害"として発生されます。
以上で完了です。これで、NTPサービスが停止すれば以下のように障害として報告されてきます。
このサービス監視方法は汎用性はありますがチェックしているのは”プロセスが動作しているかでどうか”であり、プロセスが”正常に機能しているか”については監視していないことに注意してください。 たとえば上記のNTPのチェックでは、障害が上位のNTPサーバーとの通信との問題に関するものだと、見た目はプロセスは正常に動作しているにも関わらず実際には機能していないというケースが考えられます。 これを回避するには、実際にそのサービスを使った確認の監視アイテムとトリガーを作成すれば良い訳ですが、それは最初に説明した「機能が正常に動作するか確認する場合」 の方法を取れば可能でしょう。 ただ、利用するコマンドによっては応答に時間を要するものがあるため、サービスと通信するスクリプトを使う方法での確認はそのプログラムの特性を考慮した上での採用をお勧めします。

Topに戻る