Network Automation with Python

Case Study on Network Automation and Programmability

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

Starting point

IT administrators at a global corporation configure all network devices manually. They connect to switches and routers via SSH or console and execute commands that they have copied from text files.
This process is very time-consuming, prone to errors, and leads to inconsistent configurations within the network. Management has decided that network devices should only be configured automatically in the future.
A network engineer (me) has been tasked with designing and testing a simple solution that can be used to configure network devices automatically.

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.