Geräteüberwachung durch On-Box Python von IOS-XE

Einführung

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.

Über Guest Shell

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)

Umgebung

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

Vorbereitung für Elasticsearch

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"
        }
      }
    }
  }
}

CSR 1000V-Einstellungen

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"

Ausführungsskript

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

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

Bestätigung und Visualisierung der Ausführungsergebnisse

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.

Visualisiert mit Kibana

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.

Zusammenfassung

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

Geräteüberwachung durch On-Box Python von IOS-XE
Schaben mit Selen in Python
Betreiben Sie LibreOffice mit Python
Schaben mit Chromedriver in Python
Debuggen mit pdb in Python
Umgang mit Sounds in Python
Scraping mit Selen in Python
[Python] Ordnerüberwachung mit Watchdog
Scraping mit Tor in Python
Tweet mit Bild in Python
Kombiniert mit Ordnungszahl in Python
Zahlenerkennung in Bildern mit Python
Testen mit Zufallszahlen in Python
GOTO in Python mit erhabenem Text 3
Arbeiten mit LibreOffice in Python: Importieren
Scraping mit Selen in Python (Basic)
CSS-Analyse mit cssutils in Python
Numer0n mit Elementen, die mit Python erstellt wurden
Öffnen Sie UTF-8 mit Stückliste in Python
Verwenden Sie rospy mit virtualenv in Python3
Verwenden Sie Python in pyenv mit NeoVim
Heatmap mit Dendrogramm in Python + Matplotlib
Lesen Sie Dateien parallel zu Python
Passwort für Lehrbuch mit Python generieren
Verwenden Sie OpenCV mit Python 3 in Window
Bis zum Umgang mit Python in Atom
Beginnen Sie mit Python mit Blender
Arbeiten mit DICOM-Bildern in Python
Holen Sie sich mit Python zusätzliche Daten zu LDAP
Versuchen Sie, sich mit Python bei qiita anzumelden
Stresstest mit Locust in Python geschrieben
Python3> im Schlüsselwort> Wahr mit teilweiser Übereinstimmung?
Exklusive Steuerung mit Sperrdatei in Python
Versuchen Sie, mit Binärdaten in Python zu arbeiten
Zeichnen Sie Nozomi Sasaki in Excel mit Python
Tipps zum Umgang mit Binärdateien in Python
Zeigen Sie Python 3 im Browser mit MAMP an
So arbeiten Sie mit BigQuery in Python
Trump-Klasse in Python (mit Vergleich)
Betrieb der ACL von Cisco IOS-XE mit RESTCONF (Python-Version)
Umgang mit "Jahren und Monaten" in Python
Verarbeiten Sie mehrere Listen mit for in Python
Ersetzen Sie Nicht-ASCII durch reguläre Ausdrücke in Python
Einzeiler webServer (mit CGI) in Python
Verkehrsüberwachung mit Kibana, ElasticSearch und Python
Beginnen wir mit TopCoder in Python (Version 2020)
Verarbeiten Sie Bilder in Python ganz einfach mit Pillow
So betreiben Sie die Zeitstempelstation in Python
Rufen Sie APIGateWay mit APIKey in Python-Anforderungen auf
Lesen von Zeichen in Bildern mit Python OCR
Einführung von sip-4.14 in der Python3.2.2-Umgebung mit MacOS 10.7.4
Einfache Serverüberwachung mit AWS Lambda (Python) und Ergebnisbenachrichtigung mit Slack
Quadtree in Python --2
Python in der Optimierung
FizzBuzz in Python3
Metaprogrammierung mit Python
Python 3.3 mit Anaconda