全自動Zabbix完全版


Zabbix Advent Calendar 2015 19日目の記事です。
#全自動Zabbix
##前書き
複数の方が「全自動Zabbix」を提案していますが
私の「全自動Zabbix」はZabbixの基本機能を組み合わせ、ノンコーディングで実装することをテーマとしています。
これは、開発環境や外部要因に依存せずZabbix単体で実現することを目指すためです。

##序文
「Zabbixは設定が大変」を言われることがありますが、
そんな方は是非私が3年前からご提案している
全自動Zabbixをお試し下さい。
[全自動Zabbix](http://www.slideshare.net/qryuu/zabbix-20563483)
[AutoScalingも怖くない、Zabbix自動登録](http://blog.serverworks.co.jp/tech/2014/05/29/zabbix-auto-registration/)
[全自動Zabbix2.2&2.4](http://www.slideshare.net/qryuu/zabbix2224)
Zabbixの自動化というと、
[Ansible ZabbixモジュールでZabbix設定を自動化](http://qiita.com/ike_dai/items/aa592f02a47d023911ed)や
ZabbixAPIを用いた方法が紹介されています。

DevOpsな環境においては、こういった方法は非常に有効です。
しかしながら、必ずしもそういった環境ばかりではありません。
またクラウドのオートスケーリングなどDevOpsのプログラムによらない、
構成変更が行われる環境では、この手法がつかえません。

また、Zabbixの監視対象はサーバーだけでは無くネットワーク機器も含まれます。
今後のSDNにおいては、ZabbixAPIによる自動監視も可能になることが考えられますが現時点においては、まだ通常のネットワーク機器が多いため、これらの自動監視についても
是非今回の全自動Zabbixを参考にしていただければ幸いです。

##技術要素
全自動Zabbixでは以下のZabbixの基本機能を組み合わせて使用します。
また、機能要件としてZabbix2.2以降が必要となります。
（部分的にはZabbix1.8,2.0でも実現は可能です）
- Agent自動登録
- ディスカバリ
- アクション-自動登録
- アクション-ディスカバリ
- テンプレート
- ZabbixAgent-HostnameItem
- ZabbixAgent-HostMetadata
##Agent監視対象の自動登録
ZabbixAgentは起動後「ZabbixAgent（アクティブ）」の監視項目リストを取得するために
zabbix_agentd.conf(Windowsの場合zabbix_agentd.win.conf）のRefreshActiveChecksに指定された周期毎に
ServerActiveに指定されたサーバに対してアクセスを行います。

ZabbixServerは接続してきたAgentのHostnameが既に登録されていない場合
ZabbixServerの[設定]-[アクション]-[自動登録]に設定されたアクションが動作します。
<img width="426" alt="2015-12-19_22h46_14.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/cf939ee9-ece1-d3ab-8118-dda643518015.png">

自動登録アクションでは、
1. 経由したZabbixProxy
2. HostMetadataに含まれる文字列
3. Hostnameに含まれる文字列
を条件として
<img width="510" alt="2015-12-19_22h52_32.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/da37355d-ab43-838b-9b5a-9151786892c9.png">

1. メッセージ送信
2. リモートコマンドの実行
3. ホストの登録
4. ホストのホストグループへの追加
5. ホストへのテンプレートのリンク
6. ホストの無効化

を実施することが可能です。
<img width="515" alt="2015-12-19_22h50_11.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/c0991670-1a95-9c91-dac0-392b29c1c818.png">


この自動登録アクションを設定することにより、
ZabbixAgentをインストールしたサーバを仮想化環境やクラウド環境で複製した場合や
新規のサーバにZabbixAgentをインストールして起動しただけで、自動的にZabbixに登録することが出来るようになります。
これで、サーバーが増える毎に監視担当者が対応する必要がなくなります。

なお、ZabbixAgentの設定を行う際にHostname= をコメント化して
HostnameItem=を有効にすることにより、ZabbixAgentがZabbixServerに対して通知するHostnameの設定がsystem.hostnameから自動的に設定されるようになります。

アクションの動作条件の中でZabbixProxyやHostMetadataが利用できるので
HostMetadataにOSやミドルウェアの情報を記載することにより
リンクさせるテンプレートを仕分けすることができます。

またProxyを条件にすることにより、ネットワーク毎に所属させるホストグループを分けるような設定が可能です。

##ディスカバリ自動登録
ZabbixにはAgentとは別に、ZabbixServerが定期的にネットワーク範囲を走査するディスカバリ機能があります。
このディスカバリ結果を元に監視対象の自動登録を行う場合は
[設定]-[アクション]-[ディスカバリ]の設定を利用します。
<img width="516" alt="2015-12-19_23h17_52.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/025bdd08-aa8b-d2ec-5a7d-2620426c0ec4.png">

ディスカバリアクションでは
1. アップ状態、ダウン状態の継続時間
2. ディスカバリに応答したサービスタイプ（<img width="92" alt="2015-12-19_23h23_18.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/7616a172-48f5-44e5-9e6e-dbb3d3bf755c.png">）
3. ディスカバリに応答したポート番号
4. ディスカバリのステータス（<img width="45" alt="2015-12-19_23h22_45.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/2d24894b-b018-ccf8-c170-0535ce8e7313.png">）
5. ディスカバリオブジェクト
6. ディスカバリ設定の取得項目
7. ディスカバリ設定
8. 経由したZabbixProxy
9. ディスカバリによって見つかったホストのIPアドレス
10. ディスカバリ設定の取得項目が取得した値

<img width="515" alt="2015-12-19_23h18_25.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/0a58fab9-2a26-c637-f021-bfeadf1ba2a6.png">
によって条件分けを行う事が可能です。

ディスカバリアクションでは
1. メッセージ送信
2. リモートコマンドの実行
3. ホストの追加
4. ホストの削除
5. ホストのホストグループへの追加
6. ホストのホストグループからの削除
7. ホストへのテンプレートのリンク
8. ホストからのテンプレートの削除
9. ホストの有効化
10. ホストの無効化
を行う事ができます。
<img width="515" alt="2015-12-19_23h31_16.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/b7c84f69-45dd-1a84-4250-235841182884.png">

ディスカバリアクションではZabbixAgentによらず、ZabbixServer自身がネットワーク範囲を走査するため、ネットワーク機器に対しても利用することが可能です。

また、ディスカバリアクションでは監視対象のダウン状態を判定に利用することができるため、
自動登録だけではなく、監視の無効化や監視項目の削除にも利用することが出来ます。

つまりディスカバリアクションを用いれば
ネットワーク機器の自動監視設定のほか、Agent自動登録の自動削除に利用することも可能です。

##ディスカバリ設定
[設定]-[ディスカバリ]からネットワークディスカバリの設定を行う事が出来ます。
<img width="513" alt="2015-12-19_23h42_52.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/c5f057c8-083b-92a5-ca64-3601f96388da.png">
ディスカバリ設定では
1. FTP応答
2. HTTP応答
3. HTTPS応答
4. ICMP Ping応答
5. IMAP応答
6. LDAP応答
7. NNTP応答
8. POP応答
9. SMTP応答
10. SNMP応答
11. SSH応答
12. TCPの任意ポート応答
13. Telnet応答
14. ZabbixAgentの応答
が利用できます。
また、SNMP応答とZabbixAgent応答については、プロトコルの応答確認だけでは無く
任意のOIDの値やZabbixのアイテムキーの結果を取得することが可能です。


<img width="515" alt="2015-12-19_23h43_18.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/7bd215cc-87cc-31d6-6a2e-98926795a982.png">
このため、SNMPディスカバリ設定でOID[SNMPv2-MIB::sysDescr.0]を取得することによりネットワーク機器の機種情報を収集したり、
アイテムキーの[services]により、動作しているサービスリストなどを取得することが可能です。
これらの情報を元にディスカバリアクションを設定することにより、
監視対象を自動的に判別して適切なテンプレートをリンクさせる事が可能になります。

実際には[ディスカバリアクションの実行条件]で「受信した値」に期待されるネットワーク機器の機種名や、Windowsのサービス名を指定し
[ディスカバリアクションの実行内容]でその機種やサービスのためのテンプレートをリンクさせる設定を行うことにより、監視担当者が手を動かすことなく、
機器やサーバがネットワークに接続された時点で、自動的に監視を開始させる事ができます。

さらに、ディスカバリでは、応答が無くなったと言う情報も記録、計測されるため、
ディスカバリアクションにおいて、アップ/ダウンタイムを基にしたアクションを設定することにより、自動的に監視を停止し不要なアラートが継続しないようにすることが可能です。

##ディスカバリ設定の注意点
ディスカバリ設定はCIDRや-による範囲指定により指定することが可能ですが、
GUI上で見える設定毎に、ディスカバリープロセスに振り分けられます。
つまり、非常に大きな範囲をディスカバリー範囲に指定した場合
ディスカバリプロセスに対して範囲振り分けは行わず、1つのプロセスが長い時間を掛けてディスカバリを行う事になり、
設定しているディスカバリ周期では、ディスカバリが行われないことを意味します。

ディスカバリ範囲に実際のホスト数が少ない場合、応答が無いIPアドレスが多い事になります。
この場合、ディスカバリープロセスは応答が無いIPアドレスをタイムアウトまで待ち続けるためより長い時間がかかります。

このため、/16 のような大きな範囲のディスカバリを頻繁に行いたい場合は
ディスカバリ設定を登録する時点で、手動で/19や/24の小さな範囲のディスカバリ設定を複数設定するようにして範囲をカバーしてください。
ディスカバリー周期をより短くしたい場合はさらに小さなネットワーク範囲に分割する必要がある場合もあります。
指定されたディスカバリー範囲をどの程度の時間でスキャン可能かについては、
serverのタイムアウト×ディスカバリー範囲のIPアドレス数×(1/IPアドレス利用率)で概算が可能です。

これを行わないとZabbixServerの設定で、いくらディスカバリプロセスの数を増やしても意味がありません。

Agent自動登録アクションとディスカバリアクションを適切に設定することにより、
GUIからの設定だけで、Zabbixの監視設定作業の大部分を自動化することが可能です。

APIで頑張る部分とZabbixに自動的に行わせる部分
そして、手動で設定する項目を今一度見直してみてはいかがでしょうか。

ぽちぽち設定するのが、面倒なら
自動化すれば良いじゃない。
コードを書くだけが自動化じゃ無い！

それではよいZabbixライフを