[PYTHON] Ich habe versucht, von Postman aus mit Cisco Guest Shell als API-Server zu arbeiten

Einführung

Cisco Guest Shell ist eine Linux-basierte Containerumgebung, die vom Hostgerät (IOS-XE) getrennt ist. Die IOS-XE-Einstellungen können automatisch mit Python oder ähnlichem gesteuert werden. Dieses Mal habe ich mit dem Python-Webframework "Flask" einen API-Server auf Guest Shell erstellt, das Ergebnis des Befehls show von Postman erhalten und die Schnittstelleneinstellungen geändert.

CSR1000V-Setup

IOS-XE Die virtuelle Schnittstelle "VirtualPortGroup0" (192.168.30.1) wird auf der IOS-XE-Seite erstellt und der Guest Shell-Adresse (192.168.30.2) zugeordnet, um den Zugriff von außen auf die Guest Shell zu ermöglichen. Ich werde es weglassen, da es von der Umgebung abhängt, aber für den Internetzugang habe ich PAT auch so eingestellt, dass die Guest Shell-Adresse in die Gigabit Ethernet1-Adresse konvertiert wird.

Config Config



Router(config)#iox

Router(config)#ip http server

Router(config)#interface GigabitEthernet1
Router(config-if)# ip address 192.168.100.196 255.255.255.0
Router(config-if)# exit

Router(config)#interface VirtualPortGroup0
Router(config-if)# ip address 192.168.30.1 255.255.255.0
Router(config-if)# exit

Router(config)#app-hosting appid guestshell
Router(config-app-hosting)# app-vnic gateway0 virtualportgroup 0 guest-interface 0
Router(config-app-hosting-gateway0)# guest-ipaddress 192.168.30.2 netmask 255.255.255.0
Router(config-app-hosting-gateway0)# app-default-gateway 192.168.30.1 guest-interface 0
Router(config-app-hosting)# name-server0 192.168.100.1
Router(config-app-hosting)# end

Router#guestshell enable

Bestätigungsbefehl


Router#show iox-service

IOx Infrastructure Summary:
---------------------------
IOx service (CAF) 1.10.0.1 : Running
IOx service (HA)          : Not Supported
IOx service (IOxman)      : Running
IOx service (Sec storage) : Not Supported
Libvirtd   1.3.4          : Running

Router#show app-hosting list
App id                                   State
---------------------------------------------------------
guestshell                               RUNNING

Guest Shell Verwenden Sie die Standardeinstellungen unverändert.

Router#guestshell
[guestshell@guestshell ~]$ sudo ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.30.2  netmask 255.255.255.0  broadcast 192.168.30.255
(Kürzung)

[guestshell@guestshell ~]$ netstat -nr
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.30.1    0.0.0.0         UG        0 0          0 eth0
192.168.30.0    0.0.0.0         255.255.255.0   U         0 0          0 eth0

Python-Pakete installieren

Ich habe das vorinstallierte Python 2.7.5 verwendet, um Flask und die Parser-Vorlage show command ntc_templates zu installieren.

[guestshell@guestshell ~]$ python -V
Python 2.7.5
[guestshell@guestshell ~]$ pip -V
pip 20.2.3 from /usr/lib/python2.7/site-packages/pip (python 2.7)
[guestshell@guestshell ~]$ pip install flask
[guestshell@guestshell ~]$ pip install ntc_templates

Holen Sie sich die Ergebnisse des Befehls show mit HTTP GET

Python-Code

Ich habe api.py direkt unter dem Home-Verzeichnis von Guest Shell erstellt.

[guestshell@guestshell ~]$ pwd
/home/guestshell
[guestshell@guestshell ~]$ touch api.py

Der allgemeine Ablauf der Verarbeitung ist wie folgt.

Um von außen darauf zugreifen zu können, wird "host =" 0.0.0.0 "als Argument von" app.run () "angegeben.

api.py


from flask import Flask, jsonify, request
from cli import configurep, cli
from ntc_templates.parse import parse_output

app = Flask(__name__)

@app.route("/show/<command>", methods=["GET"])
def getCommand(command):
    cmd = "show " + command.replace("_", " ")
    try:
        sh_output = cli(cmd)
        sh_output_parsed = parse_output(platform="cisco_ios", command=cmd, data=sh_output)
        return jsonify(sh_output_parsed)
    except:
        return jsonify([{"result": "Fail to parse the output"}])

if __name__ == '__main__':
    app.run(debug=False, host='0.0.0.0', port=8080)

Python-Ausführung / API-Server-Start

[guestshell@guestshell ~]$ python api.py
 * Serving Flask app "api" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)

HTTP GET von Postman

Dies ist ein Beispiel für das Abrufen des Ergebnisses des Befehls show "show ip interface brief" von Postman. Geben Sie den URI wie folgt in GET ein. Obwohl es am Ende als "ip_int_brief" abgekürzt wird, kann es problemlos analysiert werden, wenn es sich um eine Abkürzung handelt, die von NTC-Vorlagen zugelassen wird. 0927_01.png

Ändern Sie die Schnittstelleneinstellungen mit HTTP POST

Python-Code

Ich habe den Code oben zu api.py hinzugefügt. Der allgemeine Ablauf der Verarbeitung ist wie folgt.

Führen Sie nach der Bearbeitung Python aus / starten Sie den API-Server erneut.

api.py(Ergänzungen)


@app.route("/set/interface", methods=["POST"])
def setInterface():
    interface_cmd = "interface " + request.json['interface']

    if 'state' in request.json:
        if request.json['state'] == "enabled":
            state_cmd = "no shutdown"
        elif request.json['state']  == "disabled":
            state_cmd = "shutdown"
    else:
            state_cmd = ""

    if 'description' in request.json:
        description_cmd = "description " + request.json['description']
    else:
        description_cmd = ""

    if 'address' in request.json:
        address_cmd = "ip address " + request.json['address'] + " " + request.json['netmask']
    else:
        address_cmd = ""

    configurep([interface_cmd, state_cmd, description_cmd, address_cmd, "end"])
    cli("write")

    return jsonify([{"result": "Success"}])

HTTP POST von Postman

Dies ist ein Beispiel für das Festlegen der Beschreibung von GigabitEthernet2, der IP-Adresse und das Öffnen eines Ports von Postman.

Geben Sie den URI wie unten im POST gezeigt ein und geben Sie den Inhaltstyp in application / json in der Kopfzeile an. 0927_02.png

Beschreiben Sie die Einstellungsparameter in Body. Von den folgenden ist der Schnittstellenname "Schnittstelle" erforderlich, aber der andere offene / geschlossene "Zustand", die Beschreibung "Beschreibung" und die IP-Adresse "Adresse / Netzmaske" sind optional. 0927_03.png

Klicken Sie auf die Schaltfläche Senden. Bei Erfolg wird die folgende Meldung angezeigt. 0927_04.png

Sie können den Einstellungsstatus auch auf dem Terminalbildschirm überprüfen, während api.py ausgeführt wird.

192.168.100.100 - - [27/Sep/2020 05:59:20] "POST /set/interface HTTP/1.1" 200 -
Line 1 SUCCESS: interface GigabitEthernet2
Line 2 SUCCESS: no shutdown
Line 3 SUCCESS: description TEST
Line 4 SUCCESS: ip address 10.1.1.1 255.255.255.0
Line 5 SUCCESS: end

Die Einstellungen wurden problemlos auf der IOS-XE-Seite geändert und gespeichert.

Router#sh conf | begin interface GigabitEthernet2
interface GigabitEthernet2
 description TEST
 ip address 10.1.1.1 255.255.255.0
 negotiation auto
 no mop enabled
 no mop sysid

Schließlich

Als einfaches Beispiel konnte ich mit Guest Shell erfolgreich einen API-Server erstellen. Guest Shell kann jedoch Show-Befehle ausführen / Einstellungen des Geräts ohne Authentifizierung ändern, sodass unter dem Gesichtspunkt der Sicherheit und des Trail-Managements möglicherweise Probleme auftreten. Für diese Anwendung ist es möglicherweise besser, die Steuerung mit Off-Box mithilfe eines externen Tools wie Ansible anstelle des On-Box-Formats wie Guest Shell durchzuführen.

Recommended Posts

Ich habe versucht, von Postman aus mit Cisco Guest Shell als API-Server zu arbeiten
Ich habe versucht, mit pypyodbc schnell Daten von AS / 400 abzurufen
Ich habe versucht, mit pypyodbc Preparation 1 schnell Daten von AS / 400 abzurufen
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
Ich möchte DB mit Djangos ORM von einer externen Anwendung aus betreiben
Ich habe versucht, mit AWS Lambda einen AMI zu erhalten
Ich habe versucht, mit OpenCV Ann Man zu werden
Ich habe versucht, API list.csv mit Python aus swagger.yaml zu erstellen
Ich habe versucht, Videos mit der Youtube Data API (Anfänger) zu suchen.
Ich habe versucht, verschiedene Informationen von der Codeforces-API abzurufen
Ich habe versucht, das Zugriffsprotokoll mit Node.js auf dem Server auszugeben
Ich habe versucht, eine Quip-API zu erstellen
Ich habe versucht, meinen Lieblingssänger (SHISHAMO) mit der Spotify-API zu analysieren
Ich habe Teslas API berührt
Ich habe versucht, E-Mails vom Sakura-Server mit Flask-Mail zu senden
[Python] Ich habe versucht, mithilfe der YouTube-Daten-API verschiedene Informationen abzurufen!
Ich habe versucht, die checkio-API zu verwenden
Ich habe versucht, Zeichen aus Untertiteln zu extrahieren (OpenCV: Google Cloud Vision API)
[Python] [Excel] Betreiben Sie Excel-Tabellen in Python mit openpyxl (am Beispiel eines Testblatts).
Ich habe versucht, verschiedene Sätze mit der automatischen Zusammenfassungs-API "summpy" zusammenzufassen.
Ich habe versucht, Azure Speech to Text zu verwenden.
Ich habe versucht, YOUTUBE Data API V3 zu verwenden
Ich habe versucht, Text mit TensorFlow zu klassifizieren
Ich habe versucht, die selektive Suche als R-CNN zu verwenden
Ich habe versucht, die COTOHA-API zu berühren
Ich habe eine Web-API erstellt
Ich habe versucht, Headless Chrome von Selenium zu verwenden
Ich habe versucht, die BigQuery-Speicher-API zu verwenden
Ich habe versucht, die Support-Vektor-Maschine sorgfältig zu verstehen (Teil 1: Ich habe den Polynom / RBF-Kernel am Beispiel von MakeMoons ausprobiert).
Ich habe versucht, die multiple Regressionsanalyse anhand konkreter Beispiele so einfach wie möglich zu erklären.
Ich habe versucht, die Strichzeichnung mit Deep Learning aus dem Bild zu extrahieren
[Python] Ich habe versucht, den Typnamen als Zeichenfolge aus der Typfunktion abzurufen
Ich habe versucht, eine Umgebung zu erstellen, um regelmäßig mit Selenium mit AWS Fargate zu überprüfen
Ich habe versucht, Python-Code aus .Net mit Pythonnet auszuführen (Hallo World Edition)
Ich habe versucht, Remote API mit GAE / J zu verwenden
Ich habe versucht, die Qiita-API von Anfang an zu aktivieren
Ich habe versucht, durch Schaben ein Bild zu bekommen
Ich möchte mit Python eine E-Mail von Google Mail senden.
Ich habe versucht, die Google Cloud Vision-API zu verwenden
Versuchen Sie, mit Node.js einen HTTP-Server zu erstellen
Ich habe versucht, Firebase für Djangos Cache-Server zu verwenden
Ich habe versucht, Linux mit Discord Bot zu betreiben
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
Ich habe versucht, die Syntax zu bewerten, die mit der COTOHA-API zu humorvoll und humorvoll war.
[Pokemon-Schwertschild] Ich habe versucht, die Urteilsgrundlage des tiefen Lernens anhand der Drei-Familien-Klassifikation als Beispiel zu visualisieren
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
PUSH-Benachrichtigung von Python an Android mithilfe der Google-API
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren
Ich habe APN (Remote-Benachrichtigung) mithilfe der Parse.com-REST-API ausprobiert
Ich habe versucht, unsere Dunkelheit mit der Chatwork-API aufzudecken
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
[Python] Ich habe versucht, einen lokalen Server mit flask auszuführen
Ich habe versucht, PySpark von Jupyter 4.x auf EMR zu verwenden
Ich habe versucht, Daten aus einer Datei mit Node.js zu lesen.