zabbix3.0でサーバ時刻のズレを監視する（うるう秒対策）

# zabbixで時刻のズレを監視してうるう秒対策のストレス軽減を目指してみる

## １．今回の目的

（NICTのページ　キャッチフレーズに夢がある）
～　来年の元日はいつもより1秒長い日となります　～
https://www.nict.go.jp/press/2016/07/08-1.html

　2017年1月1日のAM9時（JST）にうるう秒が挟まれる事が発表されました。
各社ベンダーから対処方法が案内されていますが、
ハードやOSの問題は未然に解消できるのかなーと思ってます。
ただ古いシステムになれば成程、プログラムの動作が不安で迎えてみないとわからない環境も多いのが現実だと思います。

お正月休暇の最終日にNTPサービスを停止して、新年初営業日にNTPを起動する。
これで解決できればhappyなのですが、時刻が大きくズレて整合性がとれなくなったりしたら最悪です。

結局最後の手段として、大晦日Leap Indicatorのフラグが経つ前にNTPを停止して、元旦、AM9時以降にNTPを起動するという対応をとるエンジニアさんもいらっしゃると思います。
（私は待機要員ではないけど弊社でもそんな人います。。。）

せめて、NTPが停止している間に時間が大きくズレていないかは自動でチェックできるように、
zabbixで監視する方法を検証してみました。

## １．達成したいこと

* NTPが停止している間に閾値を超えて時刻がズレた場合に検知する

## ２．環境情報

* zabbixサーバ　v3.0.3
* zabbix agentOS　RHEL4/5/6 CentOS4/5/6/7 windows2003/7 solaris10

## ３．zabbixでの時刻監視の基本構造

zabbixには「fuzzytime」というトリガーが実装されています。

https://www.zabbix.com/documentation/2.2/jp/manual/appendix/triggers/functions

「zabbix-serverの時刻」と「監視対象サーバの時刻」を比較できます。
ここで大前提。zabbix-serverの時刻が正しくないと身も蓋もありません。

最低限の準備として、zabbix-serverがNTPなどを利用して正確な時刻を刻んでいる事を確認しましょう。

システムによっては急激な時刻補正は問題がでるので、事前に「slewモード」にしておくのが良いと思います。

```
# ntpq -p                                                                                              
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
-ntp1.jst.mfeed. 133.243.236.17   2 u   38  128  377    1.246    1.510   0.083
*ntp-a3.nict.go. .NICT.           1 u   66  128  377    1.507    0.222   0.175
x45.32.43.46.vul 47.187.174.51    2 u   36  128  377    1.671   30.210   1.057
+y.ns.gin.ntt.ne 249.224.99.213   2 u   23  128  377    1.333    0.096   0.097
+hachi.paina.jp  131.113.192.40   2 u   38  128  377    5.069   -0.080   0.434
-45.76.107.191   133.242.142.232  3 u   48  128  355    2.119   -1.580   2.935
```

* 弊社では、監視サーバはサービスに影響ないので、NTP動かしたままで時刻サーバとしての任務を全うさせます。

## ４．zabbixの時刻監視用アイテムを登録する

#### 監視対象サーバの時刻情報を取得するアイテムを作成します。

| 項目       |       値 |
|:-----------------|------------------:|
| 名前             |              お好みで |
| タイプ           |            zabbixエージェント |
| キー             |              system.localtime |
| データ型         |                数値（整数） |
| 更新間隔             |             お好みで |

標準装備のアイテム「system.localtime」を使用してローカル時間を格納します。

![2016-11-24_184715.png](https://qiita-image-store.s3.amazonaws.com/0/149632/185b7f9d-8e02-0673-7e8b-b935fdde1d45.png)

## ５．zabbix時刻監視のトリガーを登録する

#### ４で作成したアイテム（各サーバの時刻）とzabbix-serverの時刻の差分をチェックするトリガーを作成します。

![2016-11-25_110824.png](https://qiita-image-store.s3.amazonaws.com/0/149632/aef25e3d-384c-2261-eeb4-709bafea9ace.png)


| 項目       |       値 |
|:-----------------|------------------:|
| 名前             |              お好みで |
| 条件式           |            {00.TPL_Base:system.localtime.fuzzytime(3)}=0 |
| 深刻度             |              警告（お好みで） |

* この場合、zabbix-serverと差分が3秒以上なら検知する設定です。
* 「00.TPL_Base」はテンプレオート名なので自分の環境に合わせてください。

## ６．課題など

* zabbixのフォーラムを調べましたが、アイテムの監視間隔の適正値が定まっていません。
* zabbix-serverがズレると意味をなさないので、zabbix-serverでntpのプロセス監視や外部NTPとの誤差監視も合わせ技で行うのが良い。
* 閾値3秒だと古いwindows端末が頻繁に検知されてしまった。現在は閾値5秒で稼動中です

## ７．2017年の年末年始を落ち着いて過ごすためのプラン（仮）

1. ジョブ（cronやインテグレーションツール）で2016年12月31日 AM9:00前にntpdデーモンを停止。
2. 2017年1月1日 AM9:00以降にジョブでntpdデーモンを起動。
3. ntpdのslewモードで徐々に誤差修正される

* ntpd停止中に3秒以上の誤差が出たら、結局手動で調整する（zabbixアクションでntpdateするのもありかな）
* あくまでも時刻が数秒ズレても影響しないサービス用の対応です。万能策ではありませんのでご注意を。。。
* 誤差が大きいwindows端末はサービスとは無関係なので、最終的にこの端末の監視を無効化して、トリガーの閾値を短く（3秒以下）すると思います。


これで年末年始は初日の出を無事に拝みたい。