- #3 SNMPトラップ
概要
SNMPトラップの受信は、SNMP対応デバイスに対してクエリーを発行することと反対の機能です。
この場合、情報はSNMP対応デバイスから送信され、Zabbixで収集または「トラップ」されます。
トラップは通常、ある条件の変化が起こったときに送信され、(クエリーに使用されるエージェントサイドのポート161とは対照的に)エージェントがポート162でサーバへ接続します。トラップを使用すれば、クエリーの間に発生しクエリーデータでは見落とされることがある短期間の障害を検出できます。
ZabbixでのSNMPトラップの受信は設計上、snmptrapdと、トラップをZabbixへ渡すために組み込まれたメカニズムの1つです。- perlスクリプトまたはSNMPTTのどれかです。
トラップ受信の流れ:
- snmptrapdがトラップを受信します。
- snmptrapdがトラップをSNMPTTへ渡すか、Perlトラップレシーバを呼び出します。
- SNMPTTまたはPerlトラップレシーバが構文を解析し、書式を整えて、トラップをファイルへ書き込みます。
- Zabbix SNMPトラッパーがトラップファイルを読み込み、構文を解析します。
- 各トラップについて、Zabbixは、ホストインターフェースを受信先トラップアドレスと照合させながら「SNMPトラッパー」アイテムをすべて見つけます。照合動作中は、ホストインターフェースにおいて、選択した「IP」または「DNS」のみが使用されるので注意してください。
- 見つかったアイテムごとに、トラップが「snmptrap[regex]」の正規表現と比較されます。一致したすべてのアイテムの値としてトラップが設定されます。一致するアイテムが見つからないけれど「snmptrap.fallback」アイテムが存在する場合、そのトラップはそのアイテムの値として設定されます。
- トラップが、どのアイテムの値としても設定されない場合、デフォルトでZabbixが一致しなかったトラップを記録します。(これは、[管理]→[一般]→[その他]の「Log unmatched SNMP traps」で設定されます)
- SNMPトラップの設定
Webインターフェース中の以下のフィールドの設定は、このアイテムタイプに固有のものです:
- お使いのホストがSNMPインターフェースを備えていなければなりません。
[設定]→[ホスト]のホストインターフェースフィールドで、SNMP インターフェースを正しいIPアドレスまたはDNSアドレスを設定してください。受信した各トラップのアドレスは、対応するホストを探すため、すべてのSNMP インターフェースのIPアドレスおよびDNSアドレスと比較されます。
- アイテムを設定する
キーのフィールドにおいて、SNMPトラップキーの1つを使用します:
| キー | ||
|---|---|---|
| 説明 戻 | 値 コメント | |
| snmptrap[regex] | ||
| regexに一致する該当アドレスからのすべてのSNMPトラップをキャッチします。 SNMPトラップ このアイテムは、SNMPインターフェー | にのみ設定できます。 |
<このアイテムは、Zabbix 2.0.0以降でサポートされています。 注: Zabbix 2.0.5以降、このアイテムキーのパラメータ中で、ユーザーマクロおよびグローバル正規表現がサポートされています。 |
| snmptrap.fallback | ||
| そのインターフェースに対してどのsnmptrap[]アイテムでもキャッチされなかった該当アドレスからすべてのSNMPトラップをキャッチします。 SNMPトラップ このアイテムは、SNMPインターフェースにのみ設定できます。 |
<このアイテムは、Zabbix 2.0.0以降でサポートされています。 | |
この時点で、複数行にわたる正規表現の一致はサポートされていません。
構文解析されるタイムスタンプのデータ型を「ログ」に設定します。「数値」などの他の書式も許可されますが、カスタムのトラップハンドラを必要とする場合があるので注意してください。
SMMPトラップ監視が動作するためには、まず最初に正しくセットアップされていなければなりません。
- SNMPトラップ監視のセットアップ
Zabbix サーバ/プロキシの設定
トラップを読み込むためには、Zabbix サーバまたはプロキシがSNMPトラッパーのプロセスを開始するように設定されており、SNMPTTまたはPerlトラップレシーバによって書き込まれるトラップファイルを指していなければなりません。その設定を行うためには、設定ファイル(zabbix_server.conf またはzabbix_proxy.conf)を編集します:
- StartSNMPTrapper=1
- SNMPTrapperFile=[TRAP FILE]
SNMPTTの設定
最初に、snmptrapdがSNMPTTを使用するために設定する必要があります。
最高のパフォーマンスのためには、トラップを渡すsnmptthandler-embeddedを使用するデーモンとしてSNMPTTが設定される必要があります。SNMPTTのホームページで設定の説明書を参照してください: http://snmptt.sourceforge.net/docs/snmptt.shtml
SNMPTTがトラップを受信するよう設定されたら、トラップを記録する設定をします:
- Zabbixによって読み込まれるトラップファイルへトラップを記録します:
log_enable = 1
log_file = [TRAP FILE] - 日時の書式を設定します:
date_time_format = %H:%M:%S %Y/%m/%d = [DATE TIME FORMAT]
これで、Zabbixが認識するように、トラップをフォーマットします。(snmptt.confを編集する):
- 各FORMATのステートメントは、「ZBXTRAP
[address]」で始まる必要があります。[address]の値が、Zabbix
上のSNMP
インターフェースのIPアドレスとDNSアドレスと比較されます。例:
EVENT coldStart .1.3.6.1.6.3.1.1.5.1 “Status Events” Normal
FORMAT ZBXTRAP $aA Device reinitialized (coldStart) - 更に詳細は、以下のSNMPトラップのフォーマットを参照してください。
不明なトラップを使用しないでください - Zabbixはそれらを認識できません。不明なトラップは、snmptt.conf中で general イベントを定義することで扱うことができるようになります: EVENT general .* “General event” Normal
Perlトラップレシーバの設定
要件:Perl, --enable-embedded-perlでコンパイルされたNet-SNMP (Net-SNMP 5.4以降は、デフォルトで実行されています。)
Perl トラップレシーバ(misc/snmptrap/zabbix_trap_receiver.pl を探してください)は、snmptrapd からZabbix サーバへトラップを直接渡すために使用されます。これを設定するには:
- snmptrapd
設定ファイル(snmptrapd.conf)にperlのスクリプトを追加します。例:
perl do "[FULL PATH TO PERL RECEIVER SCRIPT]"; - レシーバを設定します。例:
$SNMPTrapperFile = '[TRAP FILE]';
$DateTimeFormat = '[DATE TIME FORMAT]';
スクリプト名が引用符で囲まれていない場合、以下のメッセージと同じようなメッセージを出力し起動しません。
Regexp modifiers "/l" and "/a" are mutually exclusive at (eval 2) line
1, at end of line
Regexp modifier "/l" may not appear twice at (eval 2) line 1, at end of
line
SNMPトラップのフォーマット
すべてのカスタマイズされたperlトラップレシーバとSNMPTTトラップ設定は、次の方法でトラップをフォーマットしなければなりません:
[timestamp] [the trap, part 1] ZBXTRAP [address] [the trap, part 2]
- [timestamp] - ログアイテムに使用されているタイムスタンプ
- ZBXTRAP - この行で新しいトラップを開始することを示すヘッダ
- [address] - このトラップに対してホストを発見するのに使用されるIP アドレス
処理中のメッセージから「ZBXTRAP」と「[address]」が削除されるので注意してください。トラップが他の方法でフォーマットされている場合は、Zabbixがそのトラップを期待通りには構文解析しない場合があります。
トラップの例:
11:30:15 2011/07/27 .1.3.6.1.6.3.1.1.5.3 Normal “Status Events” localhost - ZBXTRAP 192.168.1.1 Link down on interface 2. Admin state:
- Operational state: 2
これは、次のようなIP=192.168.1.1のSNMPインターフェースのトラップになります:
11:30:15 2011/07/27 .1.3.6.1.6.3.1.1.5.3 Normal “Status Events” localhost - Link down on interface 2. Admin state: 1.
- システム要求事項
ログローテーション
Zabbixは、いかなるログローテションシステムも提供していません- ユーザーがそれを行う必要があります。ログローテーションは、最初に古いファイルの名前を変更し、トラップが1つも失われないように後からファイルを削除します:
- Zabbixが最新の既知の場所のトラップファイルを開いて、ステップ3へ進みます。
- Zabbixが、 iノード番号を既定のトラップファイルのiノード番号と比較して、その時点で開かれたファイルがローテートされているかどうかチェックします。開かれたファイルが1つもない場合、Zabbixは、最新の場所をリセットしてステップ1に戻ります。
- Zabbixが、その時点で開かれているファイルからデータを読み込み、新しい場所を設定します。
- 新しいデータが構文解析されます。これがローテートファイルだった場合、ファイルは閉じられ、ステップ2に戻ります。
- 新しいデータが1つもない場合、Zabbixは1秒間スリープ状態になり、ステップ2に戻ります。
ファイルシステム
Zabbixにおいて、トラップファイルの実装のために、ファイルを識別するiノードをサポートするファイルシステムが必要です(情報はstat() のコールで統合されます)。
- セットアップの例
この例では、Zabbix サーバへトラップを渡すのにsnmptrapd と SNMPTTを使用します。以下のようにセットアップします:
- zabbix_server.conf - ZabbixがSNMP
トラッパーを開始するように設定し、トラップファイルを以下のように設定します:
StartSNMPTrapper=1
SNMPTrapperFile=/tmp/my_zabbix_traps.tmp - snmptrapd.conf - トラップハンドラとして SNMPTT を追加します:
traphandle default snmptt - snmptt.ini -出力ファイルと日時の書式を設定します:
log_file = /tmp/my_zabbix_traps.tmp
date_time_format = %H:%M:%S %Y/%m/%d - snmptt.conf - デフォルトのトラップフォーマットを定義します。
EVENT general .* "General event" Normal
FORMAT ZBXTRAP $aA $ar - SNMP アイテム「TEST」を作成します:
ホストの SNMP インターフェースの IP:127.0.0.1
キー:snmptrap["General"]
ログの時間の形式: hh:mm:ss yyyy/MM/dd
この結果は、以下のようになります:
- トラップの送信に使用されるコマンド:
snmptrap -v 1 -c public 127.0.0.1 '.1.3.6.1.6.3.1.1.5.3' '0.0.0.0' 6 33 '55' .1.3.6.1.6.3.1.1.5.3 s “teststring000” - 受信されるトラップ:
15:48:18 2011/07/26 .1.3.6.1.6.3.1.1.5.3.0.33 Normal "General event" localhost - ZBXTRAP 127.0.0.1 127.0.0.1 - アイテム「TEST」の値:
15:48:18 2011/07/26 .1.3.6.1.6.3.1.1.5.3.0.33 Normal "General event" localhost - 127.0.0.1
このシンプルな例では、トラップハンドルとしてSNMPTTを使用しています。本番システムのパフォーマンスを向上するには、埋め込みのPerlを使用し、snmptrapd から SNMPTTへまたは直接Zabbixへトラップを渡すようにしてください。
- その他の参照先
*[[https://www.zabbix.org/wiki/Start_with_SNMP_traps_in_Zabbix|CentOS based SNMP trap tutorial on zabbix.org]]
本ページは2014/08/05時点の原文を基にしておりますので、内容は必ずしも最新のものとは限りません。
最新の情報は、英語版のZabbix2.2マニュアルを参照してください。