Möglicherweise möchten Sie die Ergebnisse des Befehls show anzeigen, wenn Sie Cisco-Netzwerkgeräte überwachen. Dieses Mal möchte ich das Ergebnis des Befehls show mithilfe von Python von der Guest Shell von IOS-XE abrufen und zur Visualisierung an Elasticsearch senden.
Guest Shell ist eine Linux-Containerumgebung, die von IOx gehostet wird und in Produkten wie der Catalyst 9000-Serie und der ISR 4000-Serie implementiert ist. Guest Shell bietet eine Python-CLI-Bibliothek, mit der Sie IOSd-Befehle über ein Python-Skript ausführen können, das in Guest Shell ausgeführt wird. Informationen zu IOx finden Sie unter hier.
Das Bilddiagramm bei der Kommunikation ist wie folgt.
[Programmierkonfigurationshandbuch, Cisco IOS XE Fuji 16.9.x](https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/prog/configuration/169/b_169_programmability_cg/guest_shell. von html)
Erstellen Sie die Umgebung mit der folgenden Konfiguration. (Die Bauweise wird weggelassen) Das Überwachungsziel ist CSR1. Obwohl es vereinfacht ist, haben wir auch eine VM vorbereitet, um CSR1 zu belasten.
Software | Version |
---|---|
Elasticsearch | 6.5.0 |
Kibana | 6.5.0 |
CSR1000V | IOS-XE 16.09.04 |
Elasticsearch ist eine Volltextsuchmaschine und wird auch als Datenbankverwaltungssystem verwendet, das als Dokumentenspeicher (oder dokumentenorientiert) bezeichnet wird. Ich werde die Begriffe kurz schreiben. (Ich verstehe, bis ich es satt habe)
der Begriff | Bedeutung |
---|---|
Document | Einheit der zu speichernden JSON-Daten |
Mapping | Eine konkrete Definition des Inhalts des Dokuments |
Index | Indexname, der immer dem Dokument gegeben wird Wird als Einheit zum Einstellen und Abfragen verwendet Es kann im Voraus oder automatisch erstellt werden, wenn das Dokument registriert wird. |
Template | Einstellungen und Zuordnung werden beim Erstellen eines neuen Index angewendet |
Wir werden die folgenden Informationen als Überwachungselemente von CSR1 erhalten.
--Zeit Datum) --IOSd CPU-Auslastung (%)
Definieren Sie eine Indexvorlage, um die oben genannten Daten zu speichern. Legen Sie auch den Index fest, wenn Sie das Dokument von CSR1 in router-csr speichern.
curl -XPUT 'http://elasticsearch.example.com:9200/_template/router' -H 'Content-Type: application/json' -d @router_template.json
router_template.json
{
"template": "router-*",
"mappings":{
"monitoring": {
"dynamic": "strict",
"properties": {
"@timestamp":{
"type": "date",
"format": "date_time_no_millis"
},
"cpu_utilization_iosd":{
"type": "integer"
},
"cpu_utilization_kernel":{
"type": "integer"
},
"memory_utilization_iosd":{
"type": "integer"
},
"memory_utilization_kernel":{
"type": "integer"
},
"GigabitEthernet1_input":{
"type": "integer"
},
"GigabitEthernet1_output":{
"type": "integer"
},
"interface_status":{
"type": "keyword"
},
"routing_table":{
"type": "keyword"
}
}
}
}
}
Für die Sende- / Empfangsmenge von GigabitEthernet1 verwenden wir den Durchschnitt für 30 Sekunden. Es ist möglich, aus der Differenz in der Anzahl der gesendeten und empfangenen Pakete zu berechnen, aber ich denke, es ist einfacher, das "Ladeintervall" anzupassen und es von "show interface" abzurufen.
CSR1#conf t
CSR1(config)#interface gigabitethernet 1
CSR1(config-if)#load-interval 30
Stellen Sie als Nächstes ein, dass Guest Shell aktiviert wird, und stellen Sie NAT so ein, dass gleichzeitig von Guest Shell aus kommuniziert wird.
CSR1#conf t
CSR1(config)#iox
CSR1(config)#ip http server
CSR1(config)# interface GigabitEthernet3
CSR1(config-if)# ip nat outside
CSR1(config-if)# exit
CSR1(config)# interface VirtualPortGroup0
CSR1(config-if)# ip address 192.168.35.1 255.255.255.0
CSR1(config-if)# ip nat inside
CSR1(config-if)# exit
CSR1(config)# ip nat inside source list GS_NAT_ACL interface GigabitEthernet3 overload
CSR1(config)# ip access-list standard GS_NAT_ACL
CSR1(config-std-nacl)# permit 192.168.35.0 0.0.0.255
CSR1(config-std-nacl)# exit
CSR1(config)#app-hosting appid guestshell
CSR1(config-app-hosting)# app-vnic gateway0 virtualportgroup 0 guest-interface 0
CSR1(config-app-hosting-gateway0)# guest-ipaddress 192.168.35.2 netmask 255.255.255.0
CSR1(config-app-hosting-gateway0)# app-default-gateway 192.168.35.1 guest-interface 0
CSR1(config-app-hosting)# name-server0 192.0.2.1
CSR1(config-app-hosting)# end
CSR1#guestshell enable
Guest Shell ist jetzt aktiviert. Wenn Sie "guestshell" im privilegierten Modus ausführen, wird die Container-Bash gestartet und Sie können sich anmelden. Lassen Sie uns Guset Shell starten und IOSd-Befehle ausführen.
CSR1#guestshell
[guestshell@guestshell ~]$ dohost "show app-hosting list"
App id State
------------------------------------------------------
guestshell RUNNING
[guestshell@guestshell ~]$ python
Python 2.7.5 (default, Jun 17 2014, 18:11:42)
[GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cli
>>> cli.cli("show app-hosting list")
'\nApp id State\n------------------------------------------------------\nguestshell RUNNING\n'
>>> exit()
[guestshell@guestshell ~]$
Verwenden Sie EEM, um Guest Shell-Befehle von IOS-XE auszuführen. Sie können Python-Skripte regelmäßig ausführen, indem Sie den "Event Timer Watchdog" als Auslöser verwenden.
CSR1#conf t
CSR1(config)#event manager applet elasticsearch
CSR1(config-applet)#event timer watchdog time 30
CSR1(config-applet)#action 100 cli command "enable"
CSR1(config-applet)#action 200 cli command "guestshell run python /home/guestshell/monitoring.py"
Extrahieren Sie die Zielzeichenfolge aus dem Befehl show, der jedem Überwachungselement entspricht, und verwenden Sie sie als Wert für das Objekt vom Typ Wörterbuch. Verwenden Sie denselben Schlüssel wie Mapping. Es ist notwendig, das Format für die Zeit zu konvertieren und den Wert für die Speichernutzung zu berechnen.
--Zeit (Datum) -> Uhr anzeigen
--IOSd CPU-Auslastung (%) -> show process cpu | i CPU
--kernel CPU-Auslastung (%) -> show process cpu platform | i CPU
--IOSd-Speichernutzung (%) -> Prozessspeicher anzeigen | i Prozessor
--kernel Speicherauslastung (%) -> show process memory platform | i Systemspeicher
--GigabitEthernet1 Senden / Empfangen (bps) -> show interface GigabitEthernet1
show ip interface brief
--Routentabelle (Text) -> show ip route
Verketten Sie alle Objekte vom Typ Wörterbuch und senden Sie sie als JSON-Daten an Elasticsearch.
Der Code wird unter dem folgenden Link veröffentlicht. https://gist.github.com/ecodrive-18/f808df5a69b9a47e97288789cfa53c9d
Installieren Sie die erforderlichen Bibliotheken vor der Ausführung.
CSR1#guestshell
[guestshell@guestshell ~]$ sudo pip install -r requirements.txt
requirements.txt
elasticsearch>=6.0.0,<7.0.0
python-dateutil==2.8.1
Versuchen Sie, Elasticsearch abzufragen, um festzustellen, ob die Ergebnisse der Skriptausführung gespeichert werden können.
curl -XGET 'http://elasticsearch.example.com:9200/router-csr/monitoring/_search?size=1' | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2765 100 2765 0 0 128k 0 --:--:-- --:--:-- --:--:-- 128k
{
"took": 13,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 232,
"max_score": 1,
"hits": [
{
"_index": "router-csr",
"_type": "monitoring",
"_id": "hHV2Xm4BlqMaqiTz5GDW",
"_score": 1,
"_source": {
"GigabitEthernet1_output": "30000",
"routing_table": "\nCodes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP\n D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area \n N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2\n E1 - OSPF external type 1, E2 - OSPF external type 2\n i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2\n ia - IS-IS inter area, * - candidate default, U - per-user static route\n o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP\n a - application route\n + - replicated route, % - next hop override, p - overrides from PfR\nGateway of last resort is 172.16.0.254 to network 0.0.0.0\nS* 0.0.0.0/0 [254/0] via 172.16.0.254\n 10.0.0.0/32 is subnetted, 2 subnets\nO 10.0.0.254 [110/2] via 192.168.255.2, 19:32:27, GigabitEthernet2\nO 10.100.0.254 [110/2] via 192.168.255.2, 19:32:27, GigabitEthernet2\n 172.16.0.0/16 is variably subnetted, 3 subnets, 2 masks\nC 172.16.0.0/24 is directly connected, GigabitEthernet3\nL 172.16.0.207/32 is directly connected, GigabitEthernet3\nS 172.16.0.254/32 [254/0] via 172.16.0.254, GigabitEthernet3\n 192.168.0.0/24 is variably subnetted, 2 subnets, 2 masks\nC 192.168.0.0/24 is directly connected, GigabitEthernet1\nL 192.168.0.254/32 is directly connected, GigabitEthernet1\nO 192.168.1.0/24 [110/2] via 192.168.255.2, 19:34:13, GigabitEthernet2\n 192.168.35.0/24 is variably subnetted, 2 subnets, 2 masks\nC 192.168.35.0/24 is directly connected, VirtualPortGroup0\nL 192.168.35.1/32 is directly connected, VirtualPortGroup0\n 192.168.255.0/24 is variably subnetted, 2 subnets, 2 masks\nC 192.168.255.0/30 is directly connected, GigabitEthernet2\nL 192.168.255.1/32 is directly connected, GigabitEthernet2\n",
"cpu_utilization_iosd": "0",
"cpu_utilization_kernel": "22",
"memory_utilization_kernel": "61",
"@timestamp": "2019-11-12T16:14:30+09:00",
"interface_status": "\nInterface IP-Address OK? Method Status Protocol\nGigabitEthernet1 192.168.0.254 YES manual up up \nGigabitEthernet2 192.168.255.1 YES manual up up \nGigabitEthernet3 172.16.0.207 YES DHCP up up \nVirtualPortGroup0 192.168.35.1 YES manual up up \n",
"memory_utilization_iosd": "14",
"GigabitEthernet1_input": "787000"
}
}
]
}
}
In Hits.hits._source wurden Informationen von CSR1 gesendet. Es ist richtig gelagert.
Lassen Sie uns die Informationen visualisieren, die in Elasticsearch mit Kibana gesammelt wurden. Ich konnte die Funktion zum Anzeigen des in Visualize gespeicherten Texts nicht finden ... Es scheint, dass Markdown of Canvas diese Funktion hat, also habe ich versucht, sie zu verwenden. Wenn Sie den Text so anzeigen, wie er im Codeblock ist, wird er beschädigt, also ist es schön. Natürlich können Sie auch Diagramme erstellen.
Ich habe versucht zu visualisieren, indem ich Geräteinformationen von der Guest Shell von IOS-XE gesendet habe. Wenn diese Funktion in vielen Geräten implementiert ist, können Geräte möglicherweise mithilfe des Überwachungsagenten anstelle von SNMP überwacht werden. Übrigens muss Python bei der Überwachung des Pull-Typs ein residenter Prozess sein, bei dem Guest Shell IOSd VTY erhält. Daher muss "maxrun" beim Setzen von "event" von EEM auf 0 gesetzt werden. ..
Recommended Posts