【Zabbix】外部チェック(externalscripts)の設定手順

 

Zabbix には「外部チェック」の機能があります。

「外部チェック」を利用すると、カスタマイズした運用監視が可能になります。

 

外部チェックを利用することにより、例えば Zabbix からスクリプトをキックすることもプログラムもキックすることもできます。

要するに Zabbix を使って「自動的」「複雑」な処理が可能になります。

 

【例】

以下のような独自(オリジナル)の監視を作ることができます。

  • SSL証明書の監視
  • NTPサーバーとの時刻同期の監視
  • アプリケーションの稼働監視

 

 

Zabbixの外部チェックとは?

Zabbix サーバーが

  • シェルスクリプト
  • プログラム(実行可能ならば Ruby でも PHP でも Python でも何でもOK)

を実行することで行われるチェックです。

 

サーバーから実行するため、監視対象のサーバー上にスクリプトを展開する必要もなく、Zabbix エージェントがインストールされている必要もありません。

 

外部チェックのメリット

タマちゃん
AWS Lambda でも同様のことができるよね。しかも AWS Lambda はサーバーレスだから専用サーバーを構築する必要もないよ。
山ちゃん
確かに AWS Lambda でも同様のことができるけど、チェック結果をデータベースに保存できないのと、結果をグラフにするためにひと手間掛かるよ。

 

外部チェックのメリットは、Zabbix サーバー上から「スクリプト」や「プログラム」を実行した「結果」を Zabbix のデータベースに保存することができる点です。

しかも定期的に外部チェックをして、結果をデータベースに保存し、後から「グラフ」として表示することもできます。

 

AWS Lambda でも Lambda 上からコマンドを実行して結果を取得することができますが、そこから結果をデータベースに保存する処理や、過去の結果をグラフ化するためにはひと手間もふた手間も掛かりそうです。

 

ただ、AWS Lambda には

  • サーバーレスで専用サーバー不要
  • サーバーレスなのでサーバーの運用管理が不要
  • 毎秒何かしら処理を行うなど極端な使い方をしなければ実質無料で使える

などメリットがあります。

 

【AWS】【Python】Lambda で EC2 インスタンスを起動・停止するプログラム&スケジュール化手順【2017年最新版】

 

【AWS】【Python】Lambda で RDS インスタンスを起動・停止するプログラム&スケジュール化手順【2017年最新版】

 

 

外部チェックの設定手順【事前準備】

今回、以下のように「外部チェック」の設計をしました。

設計・やりたいこと

「NTPサーバーから定期的に時刻を取得できているか確認したい」

 

Zabbix サーバーから定期的に外部チェックスクリプト(シェルスクリプト)を実行して、

  • 正常に値を取得できた → 0 を返す
  • 正常に値を取得できなかった → 0 以外を返す

 

結果をデータベースに入れてグラフ化する

→結果をデータベースに入れるのは Zabbix が自動的にやります。

→グラフの設定をします。

 

外部チェック用のスクリプト・プログラムを設置する場所

外部チェック用のスクリプト・プログラムを設置する場所は「/etc/zabbix/zabbix_server.conf」に記載されています。

例えば、以下のようにデフォルトの場合は「/usr/lib/zabbix/externalscripts」ディレクトリにスクリプトやプログラムを配置します。

[root@cent07 ~]# less /etc/zabbix/zabbix_server.conf

 

~ 省略 ~

 

### Option: ExternalScripts
#       Full path to location of external scripts.
#       Default depends on compilation options.
#
# Mandatory: no
# Default:
# ExternalScripts=${datadir}/zabbix/externalscripts

ExternalScripts=/usr/lib/zabbix/externalscripts ← ここにシェルスクリプト・プログラムを保存します。

 

 

 

外部チェック用のシェルスクリプト

以下のシェルスクリプトで NTP サーバーの稼働チェックをして値を取得します。

  • $1 ← 引数
  • $? ← ntpdate コマンドの終了ステータス

引数に与えられた NTP サーバーに対して ntpdate コマンドを実行して正常に終了した場合(問題なく情報を取得できた場合)は「0」が返り、失敗した場合は「1」が返ってきます。

[root@cent07 ~]# vi /usr/lib/zabbix/externalscripts/ntpcheck.sh

#!/bin/sh

/usr/sbin/ntpdate -q $1 >/dev/null ; echo $?

 

スクリプトには「/dev/null」が必要です。

/dev/null がないと返り値が以下のようになり、値が取れなくなります。

[root@cent07 ~]# /usr/sbin/ntpdate -q ntp.nict.jp ; echo $?
server 133.243.238.243, stratum 1, offset 0.000517, delay 0.02974
server 133.243.238.164, stratum 1, offset 0.000319, delay 0.03003
server 133.243.238.163, stratum 1, offset 0.000676, delay 0.03053
server 133.243.238.244, stratum 1, offset 0.000479, delay 0.03021
26 Sep 21:59:09 ntpdate[1824]: adjust time server 133.243.238.243 offset 0.000517 sec
0 ← 黄色の文字全部が返り値になり、「0」だけを取得できない。
[root@cent07 ~]#

 

 

外部チェック用シェルスクリプトの設定(権限・所有者)

シェルスクリプトを作成したら所有者を「Zabbix」に変更して、実行権限を与え、動作確認をします。

[root@cent07 zabbix]# cd /usr/lib/zabbix/externalscripts
[root@cent07 externalscripts]# ls -l
合計 4
-rw-r--r-- 1 root root 43  9月 21 22:00 ntpcheck.sh ← 所有者は「root」です。
[root@cent07 externalscripts]# chown zabbix:zabbix ntpcheck.sh ← 所有者を「zabbix:zabbix」に変更します。
[root@cent07 externalscripts]# ls -l
合計 4
-rw-r--r-- 1 zabbix zabbix 43  9月 21 22:00 ntpcheck.sh ← 所有者は「zabbix:zabbix」です。
[root@cent07 externalscripts]# chmod +x ntpcheck.sh ← 実行権限を付与します。
[root@cent07 externalscripts]# ls -l
合計 4
-rwxr-xr-x 1 zabbix zabbix 43  9月 21 22:00 ntpcheck.sh ← 実行権限が付きました。
[root@cent07 externalscripts]#

 

 

シェルスクリプトの実行確認

ここで実行確認をしておきます。

アカウント zabbix で実行できるか確認します。

[root@cent07 externalscripts]# sudo -u zabbix /usr/lib/zabbix/externalscripts/ntpcheck.sh time.google.com
0
[root@cent07 externalscripts]#

 

0だけが返ってくれば成功です。

※time.google.com は Google の「Public NTP」サーバーです。

Google の「Public NTP」サーバーは「うるう秒」対策まで考えられて設計されています。

 

Google Public NTP

https://developers.google.com/time/

 

 

外部チェックのキーの構文

外部チェックを設定する場合は「キー」を設定します。

構文:スクリプト名[パラメータ]

 

今回の場合は「ntpcheck.sh[time.google.com]」になります。

 

 

外部チェックの設定手順

準備はできたので Zabbix 上で設定を入れていきます。

 

テンプレートを作成する

Zabbix にログインし「設定」-「テンプレート」をクリックします。

テンプレートページに移動したら「テンプレートの作成」ボタンをクリックします。

【Zabbix】外部チェック(externalscripts)の設定手順

 

以下の設定で「テンプレート」を作成します。

  • 表示名         : NTPサーバーのチェック【time.google.com】

 

設定したら「追加」ボタンをクリックします。

【Zabbix】外部チェック(externalscripts)の設定手順

 

 

以下のようにテンプレートに追加されたことを確認します。

【Zabbix】外部チェック(externalscripts)の設定手順

 

以上でテンプレートの作成は完了です。

 

アイテムを作成する

続けて「アイテム」を作成します。

先ほどの「テンプレート」のページから作成したテンプレート(NTPサーバーのチェック【time.google.com】)の「アイテム」をクリックします。

【Zabbix】外部チェック(externalscripts)の設定手順

 

 

 

「アイテム」ページに移動したら「アイテムの作成」ボタンをクリックします。

【Zabbix】外部チェック(externalscripts)の設定手順

 

 

アイテムのページが表示されたら以下のように設定します。

  • 名前           : NTPサーバーのチェック
  • タイプ          : 外部チェック
  • キー           : ntpcheck.sh[time.google.com]
  • アプリケーションの作成  : ntp_check

 

設定を入れたら「追加」ボタンをクリックします。

【Zabbix】外部チェック(externalscripts)の設定手順

 

以下のようにアイテムが追加されたことを確認します。

【Zabbix】外部チェック(externalscripts)の設定手順

 

 

ホストを作成する

外部チェックを実行するための「ホスト」を作成します。

メニューより「設定」-「ホスト」をクリックします。

「ホスト」ページより「ホストの作成」ボタンをクリックします。

【Zabbix】外部チェック(externalscripts)の設定手順

 

 

 

「ホスト」は Zabbix から見た監視対象になるのですが、自分自身になるので「エージェントのインターフェース」「127.0.0.1」のままにします。

設定を入れたら「追加」ボタンをクリックします。

 

下図のようにホストが追加されていることを確認します。

 

 

ホストにテンプレートを適用する

ホストを作成したらテンプレートを適用します。

メニューより「設定」-「ホスト」をクリックします。

ホスト一覧より先ほど作成した「NTPサーバーのチェックテスト【time.google.com】」をクリックします。

 

 

「テンプレート」タブをクリックします。

 

 

 

「新規テンプレートをリンク」の「選択」ボタンをクリックします。

【Zabbix】外部チェック(externalscripts)の設定手順

 

 

テンプレートウィンドウが開いたら、対象のテンプレート(今回の場合は「NTPサーバーのチェック【time.google.com】」)にチェックを入れて「選択」ボタンをクリックします。

【Zabbix】外部チェック(externalscripts)の設定手順

 

 

下図のようにテンプレートが表示されたら「追加」をクリックします。

※「更新」ボタンではありません。

NTPサーバーのチェック【time.google.com】

 

 

 

「テンプレートとのリンク」「テンプレート(今回の場合は「NTPサーバーのチェック【time.google.com】」)」が追加されていることを確認して「更新」ボタンをクリックします。

NTPサーバーのチェック【time.google.com】

 

 

 

下図のようにテンプレートが追加されていることを確認します。

「NTPサーバーのチェック【time.google.com】」

 

以上で「ホスト」と「テンプレート」の関連付けが完了しました。

 

グラフを作成する

次にグラフを作成します。

先ほどのホスト一覧より「グラフ」をクリックします。

「NTPサーバーのチェック【time.google.com】」

 

 

 

右上の「グラフの作成」ボタンをクリックします。

【Zabbix】外部チェック(externalscripts)の設定手順

 

 

以下のように設定をします。

名前    :  NTPサーバーのチェック

幅       :  900(デフォルト)

グラフのタイプ  :  ノーマル(デフォルト)

凡例を表示    :  チェック(デフォルト)

ワーキングタイムの表示   :  チェック(デフォルト)

トリガーを表示   :  チェック(デフォルト)

パーセンタイルライン (左)  :  チェックなし(デフォルト)

パーセンタイルライン (右)  :  チェックなし(デフォルト)

Y軸の最小値  :  計算(デフォルト)

Y軸の最大値  :  計算(デフォルト)

アイテム  :  NTPサーバーのチェックテスト【time.google.com】: NTPサーバーのチェック

 

アイテムの「追加」をクリックします。

【Zabbix】外部チェック(externalscripts)の設定手順

 

 

アイテムのウィンドウが表示されたら対象のアイテム(今回の場合は「NTPサーバーのチェック」)にチェックを入れて「選択」ボタンをクリックします。

【Zabbix】外部チェック(externalscripts)の設定手順

 

 

アイテムが追加されていることを確認して「追加」ボタンをクリックします。

NTPサーバーのチェックテスト【time.google.com】: NTPサーバーのチェック

 

 

グラフが追加されていることを確認します。

NTPサーバーのチェックテスト【time.google.com】: NTPサーバーのチェック

 

 

0なので分かりにくいですが、以下のように値が「0」が取得できれば正しく設定が出来ています。

 

アイテムがタイムアウトになる場合の対処

以下のようにうまく取得できない場合の対処方法です。

スタータスが「取得不可」になっています。

【Zabbix】外部チェック(externalscripts)の設定手順

 

エラーメッセージを確認すると「Timeout while executing a shell script」というエラーが表示されています。

【Zabbix】外部チェック(externalscripts)の設定手順

 

 

「Timeout while executing a shell script」というメッセージが出力されているので、対処方法として「タイムアウト」の値を変更してみます。

[root@cent07 zabbix]# vi zabbix_agentd.conf

 

~ 省略 ~

 

### Option: Timeout
#       Spend no more than Timeout seconds on processing
#
# Mandatory: no
# Range: 1-30
# Default:
# Timeout=3
Timeout=30 ← デフォルトではタイムアウトがたったの3秒なので、30秒に延ばします。

 

 

コンフィグを変更したら Zabbix-agent を再起動します。

[root@cent07 externalscripts]# systemctl restart zabbix-agent
[root@cent07 externalscripts]# systemctl status zabbix-agent
● zabbix-agent.service - Zabbix Agent
   Loaded: loaded (/usr/lib/systemd/system/zabbix-agent.service; enabled; vendor preset: disabled)
   Active: active (running) since 月 2017-09-25 23:48:25 JST; 5s ago
  Process: 1613 ExecStop=/bin/kill -SIGTERM $MAINPID (code=exited, status=0/SUCCESS)
  Process: 1616 ExecStart=/usr/sbin/zabbix_agentd -c $CONFFILE (code=exited, status=0/SUCCESS)
 Main PID: 1618 (zabbix_agentd)
   CGroup: /system.slice/zabbix-agent.service
           tq1618 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
           tq1619 /usr/sbin/zabbix_agentd: collector [idle 1 sec]
           tq1620 /usr/sbin/zabbix_agentd: listener #1 [waiting for connection]
           tq1621 /usr/sbin/zabbix_agentd: listener #2 [waiting for connection]
           tq1622 /usr/sbin/zabbix_agentd: listener #3 [waiting for connection]
           mq1623 /usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]

 9月 25 23:48:25 cent07 systemd[1]: Starting Zabbix Agent...
 9月 25 23:48:25 cent07 systemd[1]: PID file /run/zabbix/zabbix_agentd.pid not readable (yet?) a...art.
 9月 25 23:48:25 cent07 systemd[1]: Started Zabbix Agent.
Hint: Some lines were ellipsized, use -l to show in full.
[root@cent07 externalscripts]#

 

 

[root@cent07 zabbix]# vi zabbix_server.conf

 

Option: Timeout
#       Specifies how long we wait for agent, SNMP device or external check (in seconds).
#
# Mandatory: no
# Range: 1-30
# Default:
# Timeout=3

Timeout=30

 

 

[root@cent07 zabbix]# systemctl restart zabbix-server
[root@cent07 zabbix]# systemctl status zabbix-server
● zabbix-server.service - Zabbix Server
   Loaded: loaded (/usr/lib/systemd/system/zabbix-server.service; enabled; vendor preset: disabled)
   Active: active (running) since 月 2017-09-25 23:54:44 JST; 5s ago
  Process: 1667 ExecStop=/bin/kill -SIGTERM $MAINPID (code=exited, status=0/SUCCESS)
  Process: 1669 ExecStart=/usr/sbin/zabbix_server -c $CONFFILE (code=exited, status=0/SUCCESS)
 Main PID: 1671 (zabbix_server)
   CGroup: /system.slice/zabbix-server.service
           tq1671 /usr/sbin/zabbix_server -c /etc/zabbix/zabbix_server.conf
           tq1672 /usr/sbin/zabbix_server: configuration syncer [waiting 60 sec for processes]
           tq1673 /usr/sbin/zabbix_server: alerter #1 started
           tq1674 /usr/sbin/zabbix_server: alerter #2 started
           tq1675 /usr/sbin/zabbix_server: alerter #3 started
           tq1676 /usr/sbin/zabbix_server: housekeeper [startup idle for 30 minutes]
           tq1677 /usr/sbin/zabbix_server: timer #1 [processed 0 triggers, 0 events in 0.000000 sec, ...
           tq1678 /usr/sbin/zabbix_server: http poller #1 [got 0 values in 0.000695 sec, idle 5 sec]
           tq1679 /usr/sbin/zabbix_server: discoverer #1 [processed 0 rules in 0.008576 sec, idle 60 ...
           tq1680 /usr/sbin/zabbix_server: history syncer #1 [synced 0 items in 0.000001 sec, idle 1 ...
           tq1681 /usr/sbin/zabbix_server: history syncer #2 [synced 0 items in 0.000003 sec, idle 1 ...
           tq1682 /usr/sbin/zabbix_server: history syncer #3 [synced 0 items in 0.000001 sec, idle 1 ...
           tq1683 /usr/sbin/zabbix_server: history syncer #4 [synced 0 items in 0.000002 sec, idle 1 ...
           tq1684 /usr/sbin/zabbix_server: escalator #1 [processed 0 escalations in 0.000862 sec, idl...
           tq1685 /usr/sbin/zabbix_server: proxy poller #1 [exchanged data with 0 proxies in 0.000003...
           tq1686 /usr/sbin/zabbix_server: self-monitoring [processed data in 0.000013 sec, idle 1 se...
           tq1687 /usr/sbin/zabbix_server: task manager [processed 0 task(s) in 0.001943 sec, idle 5 ...
           tq1688 /usr/sbin/zabbix_server: poller #1 [got 0 values in 0.000007 sec, idle 5 sec]
           tq1689 /usr/sbin/zabbix_server: poller #2 [got 0 values in 0.000006 sec, idle 5 sec]
           tq1690 /usr/sbin/zabbix_server: poller #3 [got 0 values in 0.000006 sec, idle 5 sec]
           tq1691 /usr/sbin/zabbix_server: poller #4 [got 0 values in 0.000004 sec, idle 5 sec]
           tq1692 /usr/sbin/zabbix_server: poller #5 [got 0 values in 0.000005 sec, idle 5 sec]
           tq1693 /usr/sbin/zabbix_server: unreachable poller #1 [got 0 values in 0.000005 sec, idle ...
           tq1694 /usr/sbin/zabbix_server: trapper #1 [processed data in 0.000000 sec, waiting for co...
           tq1695 /usr/sbin/zabbix_server: trapper #2 [processed data in 0.000000 sec, waiting for co...
           tq1696 /usr/sbin/zabbix_server: trapper #3 [processed data in 0.000000 sec, waiting for co...
           tq1697 /usr/sbin/zabbix_server: trapper #4 [processed data in 0.000000 sec, waiting for co...
           tq1698 /usr/sbin/zabbix_server: trapper #5 [processed data in 0.000603 sec, waiting for co...
           tq1699 /usr/sbin/zabbix_server: icmp pinger #1 [got 0 values in 0.000006 sec, idle 5 sec]
           tq1700 /usr/sbin/zabbix_server: alert manager #1 [sent 0, failed 0 alerts, idle 5.059584 s...
           tq1701 /usr/sbin/zabbix_server: preprocessing manager #1 [queued 0, processed 0 values, id...
           tq1702 /usr/sbin/zabbix_server: preprocessing worker #1 started
           tq1703 /usr/sbin/zabbix_server: preprocessing worker #2 started
           mq1704 /usr/sbin/zabbix_server: preprocessing worker #3 started

 9月 25 23:54:44 cent07 systemd[1]: Starting Zabbix Server...
 9月 25 23:54:44 cent07 systemd[1]: PID file /run/zabbix/zabbix_server.pid not readable (yet?) a...art.
 9月 25 23:54:44 cent07 systemd[1]: Started Zabbix Server.
Hint: Some lines were ellipsized, use -l to show in full.
[root@cent07 zabbix]#

 

 

 

 

 

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人

コメントを残す

メールアドレスが公開されることはありません。