使用关联事件触发事件策略
配置事件策略,以便在发生两个或多个相关事件时执行。
如何在事件策略中表示触发和关联事件
在事件脚本参数和受支持的事件策略语句(如 execute-commands 语句)中,您可以使用事件策略变量来区分 触发事件 和 相关事件。您可以在层次结构级别的 [edit event-options policy policy-name] 以下语句中配置触发事件和关联事件:
- 触发事件 — 在语句中
events配置 - 关联事件 — 在语句中
within seconds events配置
您可以使用以下形式的事件策略变量来表示触发和关联事件:
-
{$$.attribute-name}—双美元符号 ($$) 表示法表示触发策略的事件。当与属性名称组合时,该变量将解析为与触发事件关联的属性的值。例如,{$$.interface-name}解析为与触发事件关联的接口名称。 -
{$event.attribute-name}- 带有事件名称 ($event) 表示法的单个美元符号表示与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},将 event e1, e2or 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发生在 、 或 e6之后的 60 e5秒e4内,则将该相关事件的属性值 interface-name (e4 , e5或 e6) 替换{$*.interface-name}为该e3变量。 e2如果关联事件没有interface-name属性,则软件不会执行命令show interfaces {$*.interface-name}。
如果在两个 和 的 的 60 秒内发生,则e1{$*.interface-name}该变量使用 的属性e4值 interface-name 。e5e4策略使用e4,因为事件进程 (eventd) 按语句中within配置的顺序搜索相关事件。在这种情况下,顺序> e5 >e4e6。
示例:基于时间间隔关联事件
以下事件策略发出一组命令,并将生成的输出文件上传到存档站点。如果其中一个触发事件 event3、 event4或 event5发生在其中一个相关事件 或 event2event1 发生后的 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;
}
事件策略目标定义了两个归档站点。设备会尝试传输到列表中的第一个存档站点,仅当传输失败时才会移动到下一个站点。事件策略配置为:
[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;
}
}
}
示例:基于事件属性关联事件
在以下事件策略中,如果两个事件的事件属性值匹配,则这两个事件是相关联的。匹配两个事件的属性可确保两个事件相关。在这种情况下,接口地址必须匹配,物理接口 (ifd) 名称也必须匹配。
当路由协议进程 (rpd) 向内核发送更改接口状态的请求,但请求失败时,就会发生错误 RPD_KRT_IFDCHANGE 。如果接口配置了路由器发现,但接口不按要求支持 IP 组播操作,则会发生此 RPD_RDISC_NOMULTI 错误。
[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事件会发生两次。第一个事件消息表示回滚正在进行中,第二个事件消息表示回滚已完成。因此,事件策略必须将两个UI_COMMIT_NOT_CONFIRMED事件关联起来,以便系统不会触发事件策略两次。在此示例中,第二个UI_COMMIT_NOT_CONFIRMED事件必须在第一个事件发生后的 50 秒内发生。
为了确定配置是否导致与管理网络的连接中断,事件策略还会将UI_COMMIT_NOT_CONFIRMED事件与 RPM 探测的PING_TEST_FAILED事件相关联。当管理网络的 RPM 测试失败时,将发生PING_TEST_FAILED事件。在此示例中,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