相関イベントを使用したイベントポリシーのトリガー
2つ以上の相関イベントが発生したときに実行するイベントポリシーを設定します。
イベントポリシーでトリガーイベントと関連付けイベントを表す方法
イベントスクリプト引数や、 execute-commands ステートメントなどのサポートされているイベントポリシーステートメントでは、イベントポリシー変数を使用して、 トリガーイベント と 相関イベントを区別できます。トリガーイベントと相関イベントは、 [edit event-options policy policy-name] 階層レベルの以下のステートメントで設定します。
- トリガーイベント—
eventsステートメントで設定 - 相関イベント—
within seconds eventsステートメントで設定
以下の形式のイベントポリシー変数を使用して、トリガーイベントと相関イベントを表すことができます。
-
{$$.attribute-name}—ダブルドル記号($$)表記は、ポリシーをトリガーするイベントを表します。属性名と組み合わせると、変数はトリガーイベントに関連付けられた属性の値に解決されます。たとえば、{$$.interface-name}はトリガーイベントに関連付けられたインターフェイス名に解決されます。 -
{$event.attribute-name}—イベント名($event)表記の付いた1つのドル記号は、eventに一致する最新のイベントを表しています。属性名と組み合わせると、変数はそのイベントに関連付けられた属性の値に解決されます。例えば、ポリシーがshow interfaces {$COSD_CHAS_SCHED_MAP_INVALID.interface-name}コマンドを発行すると、{$COSD_CHAS_SCHED_MAP_INVALID.interface-name}変数は、イベントプロセスによってキャッシュされた最新のCOSD_CHAS_SCHED_MAP_INVALIDイベントに関連付けられたインターフェイス名に解決されます。 -
{$*.attribute-name}—アスタリスク($*)表記の付いたドル記号は、相関するイベントのいずれかに一致する最新のイベントを表します。この変数は、ポリシー設定で指定された相関イベントのいずれかに一致する、最新のイベントに関連する属性の値に解決されます。
イベントポリシーでは、イベントポリシー変数を使用して特定のイベントを参照できます。次のイベントポリシーについて考えてみましょう。
[edit event-options]
policy p1 {
events [ e1 e2 e3 ];
within 60 events [ e4 e5 e6 ];
then {
execute-commands {
commands {
"show interfaces {$$.interface-name}";
"show interfaces {$e4.interface-name}";
"show interfaces {$*.interface-name}";
}
output-filename command-output.txt;
destination some-dest;
}
}
}
show interfaces {$$.interface-name}コマンドでは、イベントe1、e2、またはe3のinterface-name属性の値が{$$.interface-name}変数に置き換えられます。
show interfaces {$e4.interface-name}コマンドでは、直近のe4イベントのinterface-name属性の値が{$e4.interface-name}変数に置き換えられます。
show interfaces {$*.interface-name}コマンドでは、最新のe4、e5、またはe6イベントのinterface-name属性の値が{$*.interface-name}変数に置き換えられます。e1、e2、またはe3のいずれかがe4、e5、またはe6の後60秒以内に発生した場合、その相関イベント(e4、e5、またはe6)のinterface-name属性の値が{$*.interface-name}変数に置き換えられます。相関イベントにinterface-name属性がない場合、ソフトウェアはshow interfaces {$*.interface-name}コマンドを実行しません。
e1がe4とe5の両方から60秒以内に発生した場合、{$*.interface-name}変数はe4にinterface-name属性の値を使用します。イベントプロセス(eventd)がwithinステートメントで設定された順番に相関イベントを検索するため、ポリシーはe4を使用します。この場合、順序はe4 > e5 > e6です。
例:時間間隔に基づくイベントの関連付け
以下のイベントポリシーは、一連のコマンドを発行し、結果の出力ファイルをアーカイブサイトにアップロードします。システムは、トリガーイベント( event3、 event4、または event5)の1つが、相関イベントのいずれか( event1 または event2)が発生してから60秒以内に発生した場合、イベントポリシーを実行します。ポリシーの擬似コードは次のとおりです。
if trigger event is (event3 or event4 or event5)
and
(event1 or event2 has been received within the last 60 seconds)
then {
run a set of commands;
log the output of these commands to a location;
}
イベントポリシーの宛先は、2つのアーカイブサイトを定義します。デバイスはリストの最初のアーカイブサイトへの転送を試み、転送に失敗した場合にのみ次のサイトに移動します。イベントポリシーの設定は次のとおりです。
[edit event-options]
policy policy1 {
events [ event3 event4 event5 ];
within 60 events [ event1 event2 ];
then {
execute-commands {
commands {
"command";
}
output-filename my_cmd_out;
destination policy1-command-dest;
}
}
}
destinations {
policy1-command-dest {
archive-sites {
scp://robot@my.big.com/a/b;
scp://robot@my.little.com/a/b;
}
}
}
例: イベント属性に基づくイベントの関連付け
以下のイベントポリシーでは、イベント属性値が一致する場合、2つのイベントが相関します。両方のイベントの属性を一致させることで、2つのイベントが関連していることが保証されます。この場合、インターフェイス アドレスが一致し、物理インターフェイス(ifd)名が一致する必要があります。
RPD_KRT_IFDCHANGEエラーは、ルーティングプロトコルプロセス(rpd)がインターフェイスの状態を変更するリクエストをカーネルに送信し、リクエストが失敗した場合に発生します。RPD_RDISC_NOMULTIエラーは、インターフェイスがルーター検出用に設定されているが、必要に応じてIPマルチキャスト操作をサポートしていない場合に発生します。
[edit event-options]
policy policy1 {
events rpd_rdisc_nomulti;
within 500 events rpd_krt_ifdchange;
attributes-match {
rpd_rdisc_nomulti.interface-address equals rpd_krt_ifdchange.address;
rpd_rdisc_nomulti.interface-name starts-with rpd_krt_ifdchange.ifd-index;
}
then {
... actions ...
}
}
例:時間間隔とイベント属性に基づくイベントの関連付け
次の例では、組織は、管理ネットワークへの接続を失う結果となったすべての失敗した設定を記録したいと考えています。組織は、リアルタイムパフォーマンス監視(RPM)テストセットアップを使用して、管理ネットワークの到達可能性を毎分検証します。オペレーターは、常に commit confirmed CLIコマンドを使用して変更をコミットします。 commit confirmed コマンドを使用すると、設定の変更が接続に影響を与える場合に、設定を自動的にロールバックできます。
イベントポリシーは、イベントスクリプト save-rollback.slaxを実行して、自動ロールバックによって上書きされた失敗した設定を特定の場所にコピーします。イベントスクリプトは、保存と後で確認するために、 /config/juniper.conf.1.gz ロールバックファイルを /var/tmp ディレクトリにコピーします。
イベントポリシートリガーイベントは、UI_COMMIT_NOT_CONFIRMEDイベントです。このイベントは、デバイスが確認されたコミットを自動的にロールバックするときに発生します。システムがコミット確認ロールバックをトリガーすると、UI_COMMIT_NOT_CONFIRMEDイベントが 2 回発生します。最初のイベントメッセージはロールバックが進行中であることを示し、2番目のイベントメッセージはロールバックが完了したことを示します。したがって、イベント ポリシーは、システムがイベント ポリシーを 2 回トリガーしないように、2 つのUI_COMMIT_NOT_CONFIRMED イベントを関連付ける必要があります。この例では、2つ目のUI_COMMIT_NOT_CONFIRMEDイベントは、最初のイベントから50秒以内に発生する必要があります。
設定によって管理ネットワークへの接続が失われたかどうかを判断するために、イベント ポリシーは、UI_COMMIT_NOT_CONFIRMED イベントと RPM プローブからの PING_TEST_FAILED イベントを関連付けます。PING_TEST_FAILED イベントは、管理ネットワークへの RPM テストが失敗すると発生します。この例では、UI_COMMIT_NOT_CONFIRMEDイベントはPING_TEST_FAILEDイベントから60秒以内に発生する必要があります。イベントを生成したRPMプローブテストを指定するために、イベントポリシーには attributes-match ステートメントが含まれ、イベントの test-owner 属性が Connectivity と一致し、イベントの test-name 属性が Managementと一致する場合にのみトリガーされます。
イベントポリシーは、PING_TEST_FAILEDイベントと最初のUI_COMMIT_NOT_CONFIRMEDイベントに対して個別の within ステートメントを設定します。複数の within ステートメントを使用することで、イベントポリシーがトリガーされるには、両方の条件が発生する必要があります。各 within ステートメントに必要な時間間隔は異なります。同様に、ポリシーをトリガーするには、両方の attributes-match 条件が当てはまる必要があります。
イベントポリシーの設定は次のとおりです。
event-options {
policy faulty-rollback {
events ui_commit_not_confirmed;
within 60 events ping_test_failed;
within 50 events ui_commit_not_confirmed;
attributes-match {
ping_test_failed.test-owner matches "^Connectivity$";
ping_test_failed.test-name matches "^Management$";
}
then {
event-script save-rollback.slax;
}
}
event-script {
file save-rollback.slax;
}
}
save-rollback.slaxイベントスクリプトは次のとおりです。
version 1.2;
ns junos = "http://xml.juniper.net/junos/*/junos";
ns xnm = "http://xml.juniper.net/xnm/1.1/xnm";
ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0";
import "../import/junos.xsl";
match / {
/* Get system time with hyphens instead of spaces */
var $modified-time = translate( $localtime, " ", "-" );
/* Use time to differentiate saved rollback versions */
var $filename = "saved-rollback-" _ $modified-time _ ".gz";
/* Copy the file */
var $file-copy-rpc = <file-copy> {
<source> "/config/juniper.conf.1.gz";
<destination> "/var/tmp/" _ $filename;
}
var $results = jcs:invoke( $file-copy-rpc );
/* Report any errors or success */
if( $results/..//xnm:error ) {
for-each( $results/..//xnm:error ) {
expr jcs:syslog( "external.error", "File Copy Error: ", message );
}
}
else {
expr jcs:syslog( "external.info", "Faulty rollback configuration saved." );
}
}
Junos OSを実行しているデバイスがイベントポリシーをトリガーすると、デバイスはロールバック設定ファイルをタイムスタンプを含む新しいファイル名で/ var/tmp ディレクトリに保存します。
user@host> file list /var/tmp/saved* /var/tmp/saved-rollback-Wed-Aug-19-09:02:55-2026.gz