Bei Verwendung von EEM (Embedded Event Manager) und On-Box-Python, die von Cisco-Routern und -Switches unterstützt werden, hat sich die Route der Routing-Tabelle geändert. Ein Beispiel, das einen externen Dienst (Cisco Spark) als Auslöser benachrichtigt.
Der zu benachrichtigende Inhalt ist das geänderte Netzwerk, der geänderte Inhalt (Hinzufügen / Löschen usw.) und die geänderte Ursache (OSPF, EIGRP, BGP, CONNECTED usw.). Diese werden von EEM bereitgestellt. Das EEM-Skript ist in Python geschrieben. Das verwendete Gerät war der Catalyst 3850, den ich zur Hand hatte.
Demo-Video (YouTube wird geöffnet)
※Referenz [Python und Bash unter Cisco Catalyst IOS-XE](http://qiita.com/kikuta1978/items/1739d7d7063a20b1736f#eem%E3%81%8B%E3%82%89%E5%AE%9F%E8%A1 % 8C) Ausführen von Tcl-Skripten mit Cisco IOS EEM (http://qiita.com/kikuta1978/items/5d7d92e7f35d0a03922b) Geräteereignisse vom Catalyst-Switch-Container an Cisco Spark weitergeben
Cat3850-3#sh ver | i .bin
System image file is "flash:cat3k_caa-universalk9.16.06.01.SPA.bin"
In Python-Skript geschriebene EEM-Richtlinien werden in Flash of Catalyst installiert.
routewatch.py
Cat3850-3#dir | i routewatch.py
54679 -rw- 1043 Aug 29 2017 13:28:46 +09:00 routewatch.py
Die IOS-Befehlseinstellungen befinden sich in den folgenden zwei Zeilen. Geben Sie den Pfad des EEM-Skripts an und registrieren Sie das tatsächliche Skript (später beschrieben). Führen Sie die zweite Zeile unten aus, um das Skript zu kompilieren und im Speicher auszuführen.
event manager directory user policy "flash:/"
event manager policy routewatch.py type user
routewatch.py
::cisco::eem::event_register_routing network 1.1.1.0/24 type all ge 24
#::cisco::eem::event_register_routing network 1.1.1.0/24 type all ge 24 ratelimit 60
import requests
import sys
import eem
ACCESS_TOKEN = "<my_access_token>"
ROOM_ID = "<my_room_id>"
#Header-Erstellung
def setHeaders():
accessToken_hdr = 'Bearer ' + ACCESS_TOKEN
spark_header = {'Authorization': accessToken_hdr, 'Content-Type': 'application/json; charset=utf-8'}
return spark_header
#Poste eine Nachricht im Spark-Raum
def postMsg(the_header,roomId,message):
message = '{"roomId":"' + roomId + '","text":"' + message +'"}'
uri = 'https://api.ciscospark.com/v1/messages'
resp = requests.post(uri, data=message, headers=the_header)
print resp
#Holen Sie sich die intern für jedes EEM-Ereignis bereitgestellten Informationen und verfassen Sie eine Nachricht
event = eem.event_reqinfo()
message = '!!! RoutingTable Change Detected by EEM: !!! -> ' + event['network'] + '-' + event['type'] + '-BY-' + event['protocol']
header=setHeaders()
postMsg(header,ROOM_ID,message)
Nachfolgend einige Punkte.
Before
Cat3850-3#sh ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR
Gateway of last resort is not set
1.0.0.0/32 is subnetted, 2 subnets
C 1.1.1.1 is directly connected, Loopback100
O 1.1.1.100 [110/2] via 192.168.1.2, 01:10:05, Vlan1
192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.1.0/24 is directly connected, Vlan1
L 192.168.1.1/32 is directly connected, Vlan1
After1
Cat3850-3#sh ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR
Gateway of last resort is not set
1.0.0.0/32 is subnetted, 3 subnets
C 1.1.1.1 is directly connected, Loopback100
O 1.1.1.100 [110/2] via 192.168.1.2, 01:11:55, Vlan1
O 1.1.1.200 [110/2] via 192.168.1.2, 00:00:34, Vlan1 <---★★ Hinzugefügt
192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.1.0/24 is directly connected, Vlan1
L 192.168.1.1/32 is directly connected, Vlan1
After2
Cat3850-3#sh ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR
Gateway of last resort is not set
1.0.0.0/32 is subnetted, 2 subnets
C 1.1.1.1 is directly connected, Loopback100
O 1.1.1.200 [110/2] via 192.168.1.2, 00:03:21, Vlan1
192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.1.0/24 is directly connected, Vlan1
L 192.168.1.1/32 is directly connected, Vlan1
After3
Cat3850-3#sh ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR
Gateway of last resort is not set
1.0.0.0/32 is subnetted, 3 subnets
C 1.1.1.1 is directly connected, Loopback100
C 1.1.1.30 is directly connected, Loopback300 <---★★ Hinzugefügt
O 1.1.1.200 [110/2] via 192.168.1.2, 00:05:57, Vlan1
192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.1.0/24 is directly connected, Vlan1
L 192.168.1.1/32 is directly connected, Vlan1
Mit CLI können Sie etwas Ähnliches tun. Im Folgenden finden Sie ein Beispiel für das Schreiben eines Ereignisses, das Routenänderungen erkennt und die vom Ereignis generierten Variablen in Syslog ausgibt.
IOS-Config
event manager applet routewatch-applet
event routing network 0.0.0.0/0 type all
action 101 syslog msg "_event_type_string is $_event_type_string"
action 102 syslog msg "_routing_network is $_routing_network"
action 103 syslog msg "_routing_protocol is $_routing_protocol"
action 104 syslog msg "_routing_type is $_routing_type"
Betriebsbeispiel
Cat3850-3#
Aug 29 16:07:09.331: %HA_EM-6-LOG: routewatch-applet: _event_type_string is routing
Aug 29 16:07:09.331: %HA_EM-6-LOG: routewatch-applet: _routing_network is 1.1.1.100
Aug 29 16:07:09.331: %HA_EM-6-LOG: routewatch-applet: _routing_protocol is OSPF
Aug 29 16:07:09.331: %HA_EM-6-LOG: routewatch-applet: _routing_type is add
IOS EEM kann verschiedene Ereignisse erkennen und Maßnahmen ergreifen. Dies ist jedoch praktisch, da es nicht nur Routing-Änderungen wie in diesem Beispiel erfasst, sondern auch die geänderten Inhalte intern bereitstellt.
Es gibt einen praktischen Befehl zum Überprüfen der für jedes Ereignis generierten Variablen (Arrays) (bequemer als das Online-Handbuch). In der folgenden Befehlsausgabe kann zusätzlich zur EEM-Ereignisnotation das Array Tcl event_reqinfo bestätigt werden, es kann jedoch auch im Python-Skript wie in diesem Beispielcode verwendet werden.
Natürlich können Sie Werte auch mit einem Applet (CLI) abrufen, per Syslog oder E-Mail senden, in interne Dateien schreiben und kleine Verzweigungen und Schleifenverarbeitungen durchführen.
Cat3850-3#show event manager detector routing detailed
No. Name Version Node Type
1 routing 03.00 node0/0 RP
Tcl Configuration Syntax:
::cisco::eem::event_register_routing
[tag <tag-val>]
network <network>/<length>
[ge <ge-length>]
[le <le-length>]
[ne <ne-length>]
[type {add | remove | modify | all}]
[protocol <protocol-val>]
[queue_priority {normal | low | high | last}]
[maxrun <sec.msec>]
[ratelimit <sec.msec>]
[vrf {all | default | name=regex}]
[nice {0 | 1}]
Tcl event_reqinfo Array Names:
event_id
job_id
event_type
event_type_string
event_pub_time
event_pub_sec
event_pub_msec
event_trigger_num
event_severity
network
mask
prefix_len
protocol
type
lastgateway
distance
time
time_sec
time_msec
metric
afi
lastinterface
Applet Configuration Syntax:
[ no ] event [tag <tag-val>] routing
network <network>/<length>
[ge <ge-length>]
[le <le-length>]
[ne <ne-length>]
[type {add | remove | modify | all}]
[protocol <protocol-val>]
[maxrun <sec.msec>]
[ratelimit <sec.msec>]
[vrf {all | default | name <regex>}]
Applet Built-in Environment Variables:
$_event_id
$_job_id
$_event_type
$_event_type_string
$_event_pub_time
$_event_pub_sec
$_event_pub_msec
$_event_severity
$_routing_network
$_routing_mask
$_routing_prefix_len
$_routing_protocol
$_routing_type
$_routing_tag_name
$_routing_vrf_name
$_routing_topo_name
$_routing_lastgateway
$_routing_distance
$_routing_time
$_routing_time_sec
$_routing_time_msec
$_routing_metric
$_routing_lastinterface
$_routing_afi
Im Folgenden können Sie event_reqinfo für jedes Ereignis überprüfen, das mit IOS-XE 16.6 von Cat3850 verwendet werden kann. Wenn Sie sich also etwas ansehen, wird Ihre Vorstellungskraft erweitert.
Cat3850-3#show event manager detector ?
all All available event detectors
application Application event detector
cli CLI event detector
config Config event detector
counter Counter event detector
env Environmental event detector
generic Generic event detector
gold GOLD event detector
identity Identity event detector
interface Interface event detector
ioswdsysmon Ioswdsysmon event detector
ipsla IPSLA event detector
mat mac-address-table event detector
neighbor-discovery neighbor discovery event detector
nf NF event detector
none None event detector
oir OIR event detector
rf RF event detector
routing Routing event detector
rpc RPC event detector
snmp Snmp event detector
snmp-notification Snmp notification event detector
snmp-object Snmp Object event detector
syslog Syslog event detector
test Test event detector
timer Timer event detector
Das Überwachen des NetFlow-Cache und der MAC-Adresstabelle, das Erkennen von Verbindungen mit CDP / LLDP usw. scheint Spaß zu machen.
Cat3850-3#show event manager detector nf detailed
No. Name Version Node Type
1 nf 01.00 node0/0 RP
Tcl Configuration Syntax:
::cisco::eem::event_register_nf
[tag <tag-val>]
monitor_name <monitor-name value>
event_type <create|update|delete>
exit_event_type <create|update|delete>
event1-event4 <subevent-description>
[maxrun <sec.msec>]
[ratelimit <sec.msec>]
[nice {0 | 1}]
where <subevent-description> can be
field <field value>
rate_interval <rate interval value> (event1 only)
entry_value <entry value>
entry_op {eq|ge|gt|le|lt|wc}
[exit_value <exit value>]
[exit_op {eq|ge|gt|le|lt|wc}]
[exit_rate_interval <exit rate interval value>](event1 only)
Tcl event_reqinfo Array Names:
event_id
job_id
event_type
event_type_string
event_pub_time
event_pub_sec
event_pub_msec
event_trigger_num
event_severity
monitor_name
event_type
ip_protocol
source_address
source_port
dest_address
dest_port
app_name
event[1-4]_field
event[1-4]_value
Applet Configuration Syntax:
[ no ] event [tag <tag-val>] nf
monitor-name <monitor-name value>
event-type <create|update|delete>
exit-event-type <create|update|delete>
event1-event4 <subevent-description>
[maxrun <sec.msec>]
[ratelimit <sec.msec>]
where <subevent-description> can be
field <field value>
rate-interval <rate interval value> (event1 only)
entry-value <entry value>
entry-op {eq|ge|gt|le|lt|wc}
[exit-value <exit value>]
[exit-op {eq|ge|gt|le|lt|wc}]
[exit-rate-interval <exit rate interval value>](event1 only)
Applet Built-in Environment Variables:
$_event_id
$_job_id
$_event_type
$_event_type_string
$_event_pub_time
$_event_pub_sec
$_event_pub_msec
$_event_severity
$_nf_monitor_name
$_nf_event_type
$_nf_ip_protocol
$_nf_source_address
$_nf_source_port
$_nf_dest_address
$_nf_dest_port
$_nf_app_name
$_nf_event[1-4]_field
$_nf_event[1-4]_value
Es ist lange her, aber zusammenfassend war es ein Artikel, bei dem es Spaß gemacht hat, event_reqinfo () in Cisco IOS zu betrachten. Ich hoffe, dass die On-Box-Programmierbarkeit die problematischen Dinge ergänzen kann, die mit Off-Box erledigt werden können. Ich denke, Sie können EEM und event_reqinfo () auf Cisco 1812J und 892J ausprobieren. Wenn Sie EEM in Python schreiben möchten, ist IOS-XE16.5 oder höher erforderlich. Daher benötigen Sie vorerst ein Gerät wie Cat3850 oder ISR4000 / ASR1000.
Embedded Event Manager Configuration Guide, Cisco IOS Release 15M&T Programmability Configuration Guide, Cisco IOS XE Everest 16.6.1
Recommended Posts