[PYTHON] Cisco IOS-XE erfasst Änderungen in der Routing-Tabelle und sendet sie an externe Dienste

Was ist das?

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) IOS-XE EEM Routing ED with Python Script and notify to Cisco Spark

※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

Umgebung

IOS-XE-Version

Cat3850-3#sh ver | i .bin
System image file is "flash:cat3k_caa-universalk9.16.06.01.SPA.bin"

Aufbau

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

EEM Python-Skript

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.

Funktionsprüfung

1. Ausgangszustand-> 1.1.1.200 mit OSPF hinzugefügt

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

Gepostet auf Spark:

SS 2017-08-29 15.40.18.png

2. Das OSPF-Update führt dazu, dass 1.1.1.100 aus der Tabelle verschwindet

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

Gepostet auf Spark:

SS 2017-08-29 15.42.19.png

3. Fügen Sie der Tabelle 1.1.1.30 hinzu, indem Sie Loopback-Einstellungen auf dem Gerät hinzufügen

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

Gepostet auf Spark:

SS 2017-08-29 15.44.52.png

Einstellungsbeispiel mit EEM-Applet (CLI)

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

Was ist event_reqinfo ()?

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

Zusammenfassung

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.

Referenz

Embedded Event Manager Configuration Guide, Cisco IOS Release 15M&T Programmability Configuration Guide, Cisco IOS XE Everest 16.6.1

Recommended Posts

Cisco IOS-XE erfasst Änderungen in der Routing-Tabelle und sendet sie an externe Dienste
Memorandum ((1) Kopieren und Einfügen aus einem anderen Buch (2) Siehe Vergleichstabelle mit openpyxl)
Verfahren zum gleichzeitigen Ändern des Tabellennamens und des Spaltennamens des Django-Modells
Scraping Gehen Sie zu EAT-Mitgliedsgeschäften in der Präfektur Osaka und konvertieren Sie zu CSV