Netzwerkautomatisierung mit Python

Fallstudie zum Thema Netzwerkautomatisierung und Programmierbarkeit

Tags: Cisco, Networking, Python, Linux, Tailscale, Automation

Ausgangslage

IT-Administratoren eines globalen Konzerns konfigurieren sämtliche Netzwerkgeräte manuell. Sie verbinden sich via SSH oder per Konsole auf Switches und Router und führen Befehle aus, die sie von Textfiles kopiert haben.
Dieser Prozess beansprucht sehr viel Zeit, ist fehleranfällig und führt zu inkonsistenten Konfigurationen innerhalb des Netzwerks. Das Management hat entschieden, dass Netzwerkgeräte in Zukunft nur noch automatisiert konfiguriert werden sollen.
Ein Netzwerk Engineer (ich) ist mit der Aufgabe betraut worden, eine einfache Lösung zu entwerfen und zu testen, mit der Netzwerkgeräte automatisiert konfiguriert werden können.

Anforderungen

Funktionale Anforderungen

  • Das System muss Netzwerkgeräte automatisiert konfigurieren können.
  • Das System muss in einer virtuellen Umgebung entworfen und getestet werden.
  • Das System muss die Ausführung der Konfigurationsbefehle ohne manuelle Eingriffe während des Prozesses ermöglichen.
  • Das (Test)-System muss von überall auf der Welt erreichbar sein.

Qualitätsanforderungen

  • Die Software muss wartbar und erweiterbar sein.
  • Die Software muss objektorientiert (OOP) programmiert sein.
  • Die Software muss eine klare Trennung der Zuständigkeiten aufweisen.
  • Der Code muss versionskontrolliert verwaltet sein.

Randbedingungen

  • Die Lösung muss mit Cisco Catalyst 2960-X Series kompatibel sein.
  • Die Lösung muss Tailscale als VPN-Technologie verwenden.
  • Die Lösung muss in Python geschrieben sein.
  • Die Lösung muss Git als Versionsverwaltung verwenden.
  • Das Projekt muss auf GitHub gehostet sein.

Lösungssuche und Lösungswahl

Moderne Netzwerk-Automatisierungsmethoden wie NETCONF, RESTCONF, SDN oder die Nutzung des Cisco Catalyst Center werden vom vorgegebenen Cisco Catalyst 2960‑X Series Modell nicht unterstützt. Dies schränkt den Lösungsraum ein, weil eine Ansteuerung per API nicht möglich ist.
Da Python als Programmiersprache verwendet werden muss, wird der sinnvollste alternative Lösungsansatz verfolgt, Konfigurationen mittels eines Python-Scripts per SSH als Commands an Netzwerkgeräte zu senden.
Im vierten Kapitel “Python Functions, Classes and Modules” des Cisco Certified DevNet Associate DEVASC 200-901 Official Cert Guide sind nützliche Python Module aufgelistet, die in diesem Zusammenhang verwendet werden.

Design

Netzwerktopologie und Konnektivität

notion image
 
Die Testumgebung in Cisco Modeling Labs besteht aus zwei Nodes: einem Multilayer Switch und einem Alpine Linux Docker Container.
Das eth0-Interface des Containers ist im Bridge-Modus an den Host angebunden und bezieht per DHCP automatisch eine IP, wodurch Internetzugang aus CML möglich ist. Zwischen Container und Switch besteht ein direktes /30-Transitnetzwerk.
Für weltweiten Zugriff ist Tailscale auf dem Container installiert, sodass Geräte im Tailnet per SSH auf den Container zugreifen und den Switch automatisiert per Python-Script konfigurieren können. Optional kann das /30-Subnetz im Tailnet advertised werden, um das Script direkt vom lokalen System auszuführen, ohne den Container als Jump-Host zu nutzen.

Softwarearchitektur

  • SSHConnection
    • Klasse, um eine SSH-Verbindung herzustellen
    • Hat eine Beziehung zum SSHClient des Python Moduls paramiko
    • Methode connect() erwartet als Argument ein Objekt vom Typ Device
    • Design Pattern: Facade
  • Device
    • Basisklasse für Netzwerkgeräte
  • Switch
    • Implementation der Basisklasse
    • Erbt von Device
  • CommandRunner
    • Klasse, um Befehle an ein Netzwerkgerät zu senden
    • Zuständig für das File Handling

Implementation

Der Programmcode und die Konfigurationsdateien befinden sich im GitHub Repository.

Lessons Learned

  • Der Switch hat keine Internetverbindung, wenn auf dem Container kein NAT konfiguriert ist.
  • Auf dem Switch muss für den Internetzugang eine Default Static Route 0.0.0.0/0 mit dem Container als Next Hop eingerichtet werden.
  • Der Container kennt nur das direkt verbundene /30-Subnetz zum Switch. Für die Erreichbarkeit weiterer Subnetze können statische Routen eingetragen werden.

Verbesserungsmöglichkeiten

  • Die Software kann derzeit nur einen Switch gleichzeitig konfigurieren.
  • Verbesserung: Eine Liste aus Switch-Objekten erzeugen und über diese Liste iterieren
  • Moderne API-basierte Automatisierungsmethode ausprobieren
  • Robustes Error-Handling implementieren

Fazit

Die Fallstudie ist erfolgreich abgeschlossen und alle Anforderungen sind erfüllt.
Network Automation with Python