Eine Einführung in die Netzwerkautomatisierung mit Ansible
Ansible eignet sich als Tool, um einfache Aufgaben der Netzwerkautomatisierung vorzunehmen. Unser Beispiel zeigt, wie Sie Ansible konfigurieren, um ARP-Tabellendaten zu erfassen.
Ansible ist eine Automatisierungssprache und gleichzeitig der Name der zugrunde liegenden Automations-Engine. Netzwerkautomatisierung mit Ansible ist attraktiv, weil das Tool einfach gehalten ist und die Möglichkeit bietet, mit Netzwerk-Equipment zu interagieren.
Ansible lässt sich einfach erlernen, so dass Nutzer schnell produktiv damit arbeiten können. Komplexe Aufgaben zwingen die Anwender dazu, schrittweise mehr über die Konfiguration von Ansible zu erfahren – etwas, womit Netzwerktechniker vertraut sind. Die Dokumentation zu Ansible ist gut und verständlich geschrieben. Zudem stehen online zahlreiche Tutorial-Dokumente und -Videos zur Verfügung, die bei den ersten Schritten behilflich sind.
Ansible nutzt Secure Socket Shell (SSH), um mit dem Netzwerkgerät über die Kommandozeile (Command-line Interface, CLI) zu kommunizieren. Dadurch entfällt ein Agent auf dem Netzwerkgerät. Das ist ideal, um Informationen über den aktuellen Netzwerkstatus zu erfassen und anzuzeigen. Außerdem sind zusätzliche Parser verfügbar, die bei der Erstellung von Konfigurationsszenarien mit Lese-/Schreibzugriff nützlich sein können.
So nutzen Sie Ansible
Wenn Sie gerade erst in die Netzwerkautomatisierung mit Ansible einsteigen, empfehlen wir die Lektüre von Ansible for Network Automation. Diese Dokumentation enthält Links zu mehreren anderen Dokumenten, unter anderem eine Einführung (Getting started) und Themen für Fortgeschrittene (Advanced topics). Zudem finden Sie einen Link zu einer Liste mit allen Netzwerkmodulen, die eine Interaktion mit verschiedenen Netzwerkgeräten ermöglichen.
Unser Beispielskript verwendet das Modul cli_command, um CLI-Befehle an unser Testgerät, einen 3560CX-Switch von Cisco, abzusetzen. Die Module, die für einen bestimmten Anbieter spezifisch sind, beginnen mit dem OS-Namen, zum Beispiel ios_* oder eos_*.
Ansible läuft auf einem Kontrollknoten und kommuniziert mit dem CLI eines Netzwerkgeräts über das SSH-Protokoll oder die Netzwerkgeräte-APIs, sofern verfügbar. Auf dem Netzwerk-Device ist kein Agent notwendig. Die Arbeitsweise wird von leicht verständlichen Konfigurationsdateien und Kommandozeilenargumenten gesteuert.
Der beste Weg, um die ersten Schritte mit Ansible zu unternehmen, besteht darin, grundlegende Informationen von Netzwerkgeräten zu erfassen. Das Beispiel in diesem Artikel erfasst Daten der ARP-Tabelle (Address Resolution Protocol).
Verzeichnis- und Dateistruktur von Ansible
Ansible kann mit einer einfachen Konfiguration laufen. Dies führt allerdings zu einem Durcheinander von verschiedenen Konstrukten. Deutlich besser ist es, eine Verzeichnisstruktur aufzubauen, die unterschiedliche Typen von Konfigurationsdaten voneinander trennt. Für unser Beispiel nutzen wir die folgende Verzeichnis- und Dateistruktur:
├── ansible.cfg
├── group_vars
│ ├── IOS_switches.yml
├── host_vars
│ └── test_sw.yml
├── inventory.yml
└── sh_arp.yml
Die Datei ansible.cfg enthält die Konfiguration von Ansible. Standardwerte sind häufig die beste Wahl, so dass dieses File wahrscheinlich nicht benötigt wird. Es liegt im INI-Format vor, das die Syntax name = value verwendet. Die Erfassung von Geräteinformationen ist deaktiviert – entsprechend dem Eintrag gathering = explicit –, da sie für nicht vernetzte Geräte gedacht ist. Der Name der Inventardatei wird festgelegt, während wiederholte Zugriffe deaktiviert werden, wie folgend zu sehen:
1 [defaults]
2 gathering = explicit
3 inventory = inventory.yml
4 retry_files_enabled = False
Das Verzeichnis group_vars enthält Variablendefinitionen, die für verschiedene Gruppen gelten. Eine YAML-formatierte Datei in diesem Verzeichnis enthält Variablen für IOS-Switches (Internetwork Operating System).
Mit IOS_switches.yml spezifizieren wir das Ansible-Modul network_cli, legen das OS auf ios fest und geben die Login-Informationen an. Die empfohlene Sicherheitskonfiguration nutzt entweder Ansible-Vaults oder SSH-Schlüssel, so dass die Anmeldedaten nicht in einer unverschlüsselten Datei landen. Doch die Login-Informationen in eine Variablendatei zu stecken, ist für die Demonstration viel einfacher:
1 ---
2 # IOS_switches variables
3 ansible_connection: network_cli
4 ansible_network_os: ios
5 ansible_become: yes
6 ansible_become_method: enable
7 ansible_become_password: "foobar"
8
9 ansible_nutzer: tester
10 ansible_ssh_pass: foobar
Das Verzeichnis host_vars enthält Variablendefinitionen, die für jedes Gerät individuell sind. Ein gutes Beispiel ist eine Host-Variable mit ihrer Management-IP-Adresse und ihrem Host-Namen. Variablen in den Host-Dateien ersetzen die gleichen Gruppenvariablen. Somit können Nutzer Variablen für bestimmte Geräte überschreiben.
Hier ist beispielsweise die Struktur für test_sw.yml:
1 ---
2 # test_sw variables
3 ipaddr: 192.168.1.108
4 hostname: test_sw
Die Datei inventory.yml führt neben den Gerätegruppen das Inventar an Geräten im YAML-Format auf. Geräte können in mehreren Gruppen enthalten sein. Das Gerät test_sw ist Mitglied der Gruppen IOS_switches und access.
1 ---
2 all:
3 children:
4 IOS_switches:
5 hosts:
6 test_sw
7 IOS_routers:
8 hosts:
9 router1
10 access:
11 hosts:
12 test_sw
13 core:
14 hosts:
15 router1
Die Datei sh_arp.yml – im YAML-Format – wird als Ansible-Playbook bezeichnet. Es steuert die Ausführung von zwei Aufgaben (Tasks) unter Ansible: Anzeige der ARP-Tabelle und Darstellung der Ausgabe. Ein Playbook kann mehrere Plays enthalten, und jedes Play kann wiederum mehrere Tasks beinhalten.
Im Beispiel weiter unten nennen wir das Play Gather ARP data, und die Hosts sind in der Gruppe IOS_switches aufgeführt. Dieses Play umfasst zwei Tasks, jeder mit eigenem Namen. Diese Namen sind einfache Text-Strings, die in der Ausgabe angezeigt werden.
Das Modul ios_command wird verwendet, um den Befehl show arp auszuführen. Mit der Anweisung register wird die Ausgabe von ios_command in einer Ansible-Variablen mit der Bezeichnung cli_result gespeichert.
Task 2 gibt einfach das gespeicherte Ergebnis aus, wobei er die Liste von stdout_lines referenziert, die in cli_result abgelegt ist.
1 ---
2 - name: Gather ARP data
3 hosts: IOS_switches
4 tasks:
5 - name: "Task 1: Get output of show arp on IOS"
6 ios_command:
7 commands: "show arp"
8 register: cli_result
9
10 - name: "Task 2: Display stdout_lines[0]"
11 debug:
12 msg: "{{ cli_result.stdout_lines[0] }}"
Im Folgenden führen wir das Ansible-Skript aus.
1 $ ansible-playbook sh_arp.yml
2
3 PLAY [Gather ARP data] ***************************************************
4
5 TASK [Task 1: Get output of show arp on IOS] *****************************
6 ok: [test_sw]
7
8 TASK [Task 2: Display stdout_lines[0]] ***********************************
9 ok: [test_sw] => {
10 "msg": [
11 "Protocol Address Age (min) Hardware Addr Type Interface",
12 "Internet 192.168.1.108 - bcc4.933e.49c0 ARPA Vlan1",
13 "Internet 192.168.1.126 5 f894.c220.2177 ARPA Vlan1",
14 "Internet 192.168.1.133 1 88c2.55fb.9ce7 ARPA Vlan1",
15 "Internet 192.168.1.138 0 a860.b60a.7a3a ARPA Vlan1"
16 ]
17 }
18
19 PLAY RECAP ***************************************************************
20 test_sw : ok=2 changed=0 unreachable=0 failed=0
21
Ansible auf vielen Geräten ausführen
Die Stärke der Netzwerkautomatisierung mit Ansible liegt nicht darin, ein einfaches Kommando wie show arp auf nur einem Gerät auszuführen, wie wir es oben gemacht haben. Vielmehr besteht die Stärke darin, mehrere Befehle auf einer Reihe von Geräten auszuführen.
So bietet sich etwa die Möglichkeit, die Konfigurationen vieler Geräte dynamisch zu erstellen und sie auf einer Disk zu speichern, um sie später zu laden. Außerdem lässt sich überprüfen, ob Ihre Netzwerkverbindungen dem Design entsprechen und ob sie ordnungsgemäß funktionieren. Sie können zudem sicherstellen, dass Device-Konfigurationen korrekt geladen werden und über viele Geräte hinweg konsistent sind. Dazu dienen konsistente Definitionen für Quality of Service (QoS) oder MPLS-Routenziele.
Für einen einfachen Einstieg in die Automatisierung verwenden Sie das obenstehende Beispiel. Damit können Sie mehrere nützliche show-Befehle in Ihrem Netzwerk ausführen und die Ausgabe in Dateien speichern. Anschließend lassen sich mit einfachen grep-Suchausdrücken Hunderte von Files nach spezifischen Mustern durchforsten.
Eine gute Praxis ist, Kopien von show version für jedes Netzwerkgerät aufzubewahren. Dadurch haben Sie die Möglichkeit, die Geräte in Ihrem Netzwerk samt ihrer Seriennummern zu dokumentieren. Genauso hilfreich ist es, ausfindig zu machen, wo ein Gerät in Ihrem Netzwerk verbunden ist. Dazu suchen Sie nach dessen MAC- oder IP-Adresse in der gespeicherten Ausgabe der Befehle show arp und show mac address dynamic.
Netzwerkautomation mit Ansible: Nur die Spitze des Eisbergs
Ansible kann noch viel mehr Dinge für Sie erledigen. Playbooks sind hervorragende vordefinierte Tasks, aber ein Ad-hoc-Modus steht ebenfalls zur Verfügung, um das gleiche Kommando über viele Geräte hinweg auszuführen.
Mit Filtern, Parsern und Plug-ins können Sie darüber hinaus die Funktionalität erweitern. Konfigurations-Templating lässt sich realisieren, indem Sie Ansible mit der Template-Sprache Jinja2 kombinieren.
Eine weitere empfehlenswerte Ressource ist zum Beispiel das Tutorial von Nick Russo Automating Networks with Ansible the Right Way. Es beschreibt die Pflege von MPLS-Konfigurationen mit Ansible.
Ansible eignet sich hervorragend für Netzwerktechniker. Die Konfiguration von Playbooks ist nicht schwieriger zu erlernen als viele andere Netzwerkkonzepte. Sie ist leicht zugänglich, einfach zu lernen und leistungsstark. Probieren Sie die Netzwerkautomatisierung mit Ansible anhand einiger einfacher Aufgaben aus, die nur lesend auf das Netzwerk zugreifen. Sie werden sicher schon bald begeistert sein.