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.
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
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
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.
http: // <Gästeshell-IP-Adresse> / show / <Befehlsname verbunden mit _>
getCommand ()
ausUm 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)
[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)
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.
Ich habe den Code oben zu api.py hinzugefügt. Der allgemeine Ablauf der Verarbeitung ist wie folgt.
setInterface ()
ausFü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"}])
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.
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.
Klicken Sie auf die Schaltfläche Senden. Bei Erfolg wird die folgende Meldung angezeigt.
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
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.