Der Automatisierer Ansible setzt dem ständigen Wiederholen von Schritten zur Rechneradministration ein Ende. Da lohnt das Einarbeiten.
Die Automatisierung wiederkehrender Aufgaben zählt zu den mächtigsten Waffen im Köcher eines IT-Systemadministrators. Egal, ob es um die Aktualisierung oder Installation von Software geht, um Patch-Management, Benutzerverwaltung, Datensynchronisation, das Management von Systemd-Services oder das Starten von Programmen: Die Zeit der Profis ist zu kostbar, um sie mit ständig wiederholten manuellen Arbeitsschritten zu vergeuden.
Was im professionellen Bereich gilt, lässt sich auch auf den ambitionierten Anwender im Heimbereich übertragen, wenn er mehr als ein oder zwei Geräte innerhalb oder außerhalb des lokalen Netzwerks verwaltet. Das können beispielsweise PCs, Notebooks, Server, NAS-Rechner oder Single-Board-Computer sein. Hier stehen vermutlich die Aktualisierung der verwendeten Betriebssysteme sowie Änderungen an der Konfiguration und deren Verwaltung im Vordergrund der ständig wiederkehrenden Arbeiten, aber auch andere Einsatzzwecke für solche Orchestrierungswerkzeuge wären denkbar.
Automatisierung ist King
Die Pfeile im Köcher der Profis heißen dabei Puppet, Chef, Cfengine, Saltstack oder Ansible. Wir schauen uns in diesem Artikel Ansible [1] in Bezug auf seine Tauglichkeit für den Heimbereich näher an. Die Software wird seit 2012 entwickelt, die dazu 2013 gegründete Firma Ansible Works übernahm 2015 Red Hat.
Zum Portfolio zählen neben der von uns verwendeten Community-Edition auch von Red Hat lizenzpflichtig angebotene Ausgaben wie Ansible Tower [2], das unter anderem auch eine webbasierte Oberfläche bietet. Die lässt sich aber auch kostenfrei mithilfe des Projekts Ansible AWX [3] nutzen, wozu man Minikube [4] benötigt. Derzeit steht Ansible bei Version 2.11.0 und lässt sich in vielen Distributionen über das Paketmanagement installieren.
Das Client-Server-Prinzip verlangt die Installation von Ansible lediglich auf dem steuernden Rechner, auf den Clients müssen OpenSSH und Python laufen. Die Clients, auf denen die sogenannten Tasks ausgeführt werden, heißen Knoten oder englisch Nodes. Die einzelnen Nodes samt Standort, Host-Name und IP-Adresse hält eine Bestandsdatei vor, das Inventory. Aufgaben definiert man über Module. Die mittlerweile über 2000 Module erledigen jeweils eine einzelne Aufgabe, etwa das Kopieren einer Datei (Copy-Modul) oder ein Update unter Debian (APT-Modul).
Ansible für zu Hause
Da unsere Beispiele zu diesem Artikel sich auf den Betrieb im heimischen Netz konzentrieren und anstatt mit einem Server mit Github als zentrale Instanz arbeiten, müssen Sie Ansible auf allen teilnehmenden Rechnern installieren, wobei die Playbooks auch hier auf dem Control Node liegen.
Um einzelne Tasks mehrfach oder mehrere Tasks gemeinsam auszuführen, fasst man sie in einem Ablaufplan zusammen, dem sogenannten Ansible Playbook. Das geschieht in der vergleichsweise leicht lesbaren Auszeichnungssprache YAML und könnte in einer professionellen DevOps-Umgebung beispielsweise das Deployment eines Webservers inklusive der zu installierenden Dienste beschreiben. Playbooks, die auch mehrere Plays enthalten dürfen, sind der Teil von Ansible, den Sie im Endeffekt auf der Kommandozeile ausführen.
Die Playbooks schreiben Sie entweder selbst oder bedienen sich aus dem reichen Fundus von Beispielen [5] beispielsweise auf Github [6] oder der Ansible Galaxy [7]. Der Entwickler und Ansible-Buchautor Jeff Geerling bietet auf seiner Webseite ein umfangreiches Repertoire an Ansible-Inhalten [8] an. Im Internet finden Sie unter Umständen weitere Playbooks für Ihren speziellen Anwendungszweck, indem Sie diesen in der Suchmaschine mit dem Begriff “ansible” kombinieren. Eine Suche nach “ansible + nextcloud” fördert beispielsweise mehrere Seiten an Fundstellen in allen erdenklichen Kombinationen zutage, so etwa mit [9] und ohne [10] Docker.
Die Installation von Ansible nehmen Sie auf dem Rechner vor, der als Kontrollinstanz dienen soll und von dem aus Sie alle Konfigurationen auf andere Rechner ausrollen: dem sogenannten Control Node. Üblicherweise installieren Sie Ansible aus den Paketquellen der verwendeten Distribution. Möchten Sie die aktuellste Version einrichten, so hilft die Dokumentation bei der Installation mit dem Python-Tool Pip [11].
Als separates Binärpaket kommt bei der Installation auch ansible-pull auf den Rechner. Wir nutzen diese Methode im Folgenden, um selbst erstellte Playbooks aus einem Repository auf Github zu ziehen und lokal ausführen.
Git-Repository
Zu den weiteren Voraussetzungen gehört deshalb das Einrichten des erwähnten Git-Repositorys (Abbildung 1). Ob Sie dies auf Github (Abbildung 2) tun oder ein anderes Code-Hosting-System wie Gitlab oder Gitea nutzen, liegt ganz bei Ihnen. Wir gehen auf die Erstellung eines Repositorys hier nicht näher ein, Sie finden Anleitungen dazu im Internet [12]. Lokal müssen Sie zur Kommunikation mit dem Repository das Paket git installieren.

Abbildung 1: Es ist kein Hexenwerk, ein Repository bei einem Git-Hoster wie Github einzurichten. Die wichtigste Entscheidung, die Sie beim Erstellen treffen müssen, ist, ob Ihr Repo öffentlich oder privat sein soll.

Abbildung 2: Wir haben unser Repository für diesen Test ansible-desktop genannt. Falls Ihr Projekt öffentlich ist, sollten Sie es im README näher beschreiben.
SSH-Schlüssel
Es gibt mehrere Wege, um Inhalte in einem Git-Repository zu erstellen und zu editieren (Abbildung 3). Sie könnten das direkt im Repository erledigen, in unserem Fall auf Github (Abbildung 4). Es empfiehlt sich aber, das Repository auf eine lokale Maschine auszuchecken, wie es bei Git heißt. Dabei lädt der lokale Rechner das Repo herunter und stellt eine Verbindung zu Github her, die es erlaubt, die Inhalte lokal zu bearbeiten und dann hochzuladen (im Git-Jargon: “committen”). Dazu sollten Sie ein SSH-Schlüsselpaar erstellen (Abbildung 5) und den Public-Key zu Github hochladen.
Abbildung 3: Sobald Sie das Repo eingerichtet haben, geben Sie Git zur besseren Kommunikation Ihren Namen und eine E-Mail-Adresse bekannt.

Abbildung 4: Über das Bleistiftsymbol editieren Sie Inhalte direkt auf Github. Sinnvoller ist aber das Bearbeiten auf dem lokalen Rechner.

Abbildung 5: Um von Ihrem Rechner Inhalte mit Github abgleichen zu können, erstellen Sie ein SSH-Schlüsselpaar und hinterlegen den öffentlichen Schlüssel auf Github.
Ins Home geklont
Anschließend checken Sie das Repo in ein lokales Verzeichnis in Ihrem Home aus. Dazu klicken Sie im Repository auf den grünen Schalter mit der Aufschrift Code, wählen SSH und kopieren den Befehl aus der Zeile darunter (Abbildung 6). Dann geben Sie in einem Terminal aus Ihrem Home-Verzeichnis heraus den Befehl git clone ein, gefolgt vom eben kopierten Befehl. In unserem Beispiel sieht er so aus wie in der ersten Zeile von Listing 1.

Abbildung 6: Über den grünen Code-Schalter erhalten Sie in der Einstellung SSH eine URL zum Klonen des noch leeren Repos in das Home Ihres Rechners.
Der Befehl legt in Ihrem Home das Verzeichnis mit dem Namen des Repos an, in unserem Fall ~/ansible-desktop/. Darin legen Sie im nächsten Schritt Ihre Ansible-Konfiguration in Form eines Playbooks an und laden es dann nach Github in Ihr Repo hoch (“pushen”). Falls Sie mit Git nicht oder nur wenig vertraut sind, empfehlen wir das Studium der Git-Anleitung von Ionos oder einem ähnlichen Tutorial [13].
Listing 1
Playbook anlegen
$ git clone git@github.com:fethomm/ansible-desktop.git $ cd ~/ansible-desktop $ nano local.yml
Ansible-Pull
Wir nutzen in unserem Beispiel den Befehl ansible-pull, der ein Playbook aus einem entfernten Git-Repository verwendet, um Aktionen auf den definierten Rechnern vorzunehmen. Würden wir als Control Node einen entfernten Server verwenden, käme der Befehl ansible-playbook zur Anwendung. Da wir aber in diesem Beispiel lokale Maschinen mit Ansible automatisieren, ist ansible-pull das Mittel der Wahl. Der bei der Installation von Ansible eingerichtete Befehl lässt sich direkt einsetzen.
Als Nächstes legen Sie Ihr erstes Playbook in Ihrem geklonten Repository im Home an. Wir nennen es local.yml und erstellen es mit dem Kommando aus der dritten Zeile von Listing 1. Die Endung .yml gehört zur Auszeichnungssprache YAML, in der die Playbooks verfasst werden. Wir verwenden Nano als Editor, Sie können jedoch auch jeden anderen Texteditor verwenden.
Ein sehr einfach gehaltenes Playbook sehen Sie in Listing 2. Die drei Striche in der ersten Zeile definieren in YAML einen neuen Abschnitt. Achten Sie bitte akribisch darauf, dass die Einrückungen immer untereinanderstehen; am besten nutzen Sie immer zwei Leerstellen zur Einrückung.
Listing 2
Das erste Playbook
---
- hosts: localhost
connection: local
become: true
tasks:
- name: "install ghostwriter"
package:
name: "ghostwriter"
Das Tag hosts definiert in unserem Fall, dass wir lokale Maschinen bearbeiten möchten. Der Parameter connection unterstützt das, da wir hier kein SSH benötigen. Der Parameter become legt fest, dass Ansible Root-Rechte per Sudo nutzen darf, da es diese für die beabsichtigte Paketinstallation benötigt.
Als zweites Tag sehen Sie tasks. Es definiert die auszuführenden Aufgaben, entweder einen einzelnen Task oder eine Liste von Aufgaben. Jede davon verweist auf ein Modul, das Ansible ausführen soll, und definiert falls erforderlich Argumente für das auszuführende Modul. Mit name erhält der Task einen Namen, der die Aufgabe bei der Ausführung identifizierbar macht. Als Modul kommt in diesem Fall package zum Einsatz, da wir ja ein Paket installieren möchten.
Playbook hochladen …
Nun gilt es, das frisch erstellte Playbook in das zuvor erstellte Repository zu laden. Der Befehl git status sollte nun in Rot den Namen der erstellten Datei anzeigen, also local.yaml (Abbildung 7). Da es sich um eine neue Datei handelt, nutzen Sie git add, um sie der Versionskontrolle von Git hinzuzufügen.

Abbildung 7: Der Befehl git status zeigt den Status der Synchronisation zwischen Ihrem Rechner und dem Online-Repo auf Github. In unserem Fall sagt Github uns in Rot, dass es local.yaml noch nicht kennt. Ein beherztes git add local.yaml ändert das.
Dann stellen Sie die Datei zum Upload bereit. Der entsprechende Befehl lautet für unser Beispiel git commit -m "added local.yml", wobei der Kommentar mit -m zwar optional, aber sinnvoll ist, falls Sie später die Git-Historie durchforsten müssen.
Das abschließende Hochladen erledigt der Befehl git push, der vor der Ausführung das Passwort Ihres öffentlichen Schlüssels abfragt. Betrachten Sie nun auf Github den aktualisierten Stand, sehen Sie die hochgeladene Datei.
Wollten Sie einmal auf die Schnelle etwas direkt in Github editieren, etwa, weil Sie ein Komma zu setzen vergessen haben, so synchronisieren Sie den Stand mit Ihrem lokalen Repo per git pull. Damit haben wir bereits die gesamte Git-Magie erläutert, die Sie für den Anfang benötigen.
… und ausführen
Jetzt können Sie das von Ihnen im Playbook definierte Paket installieren. Achten Sie darauf, dass es noch nicht eingerichtet ist, sonst scheitert die Aufgabe. Sie installieren also den Markdown-Editor Ghostwriter, indem Sie in unserem Beispiel den Befehl aus der ersten Zeile von Listing 3 absetzen.
Listing 3
Installation per Playbook
$ sudo ansible-pull -U https://github.com/fethomm/ansible-desktop.git $ sudo ansible-pull -U https://github.com/fethomm/ansible-desktop.git meinplaybook.yml
Die benötigte URL erhalten Sie, indem Sie auf Github den grünen Code-Schalter drücken, diesmal HTTPS anklicken und den angegebenen Befehl kopieren. Später rufen Sie den Befehl aus der History auf und müssen nicht immer auf Github nachsehen. Falls die jeweilige Aufgabe keine Root-Rechte erfordert, lassen Sie Sudo einfach weg. In unserem Beispiel müssen Sie mit dem Befehl kein auszuführendes Playbook angeben, da Ansible eine Datei namens local.yml erwartet. Benennen Sie diese um, müssen Sie den Namen an den Befehl anhängen (Listing 3, letzte Zeile).
Wenn die ausführliche Ausgabe des Befehls in der letzten Zeile wie in Abbildung 8 den Eintrag changed=1 enthält, war die Aktion von Erfolg gekrönt, und Sie haben den ersten erfolgreichen Schritt ins Ansible-Universum gemacht. Mit diesem Rüstzeug im Gepäck können Sie nun zu weiteren Abenteuern aufbrechen und die Weiten von Ansible erkunden. Die Warnungen im oberen Teil der Ausgabe dürfen Sie getrost ignorieren: Sie sind der Einfachheit unseres ersten Beispiels geschuldet.

Abbildung 8: Die Ausgabe des Befehls zum Ausführen des Playbooks zeigt den Erfolg an. ok=2 steht für die zwei erfolgreichen Aktionen (Update der Quellen, Paketinstallation). Die Installation selbst bestätigt Ansible mit changed=1 nochmals als Änderung.
Erweitert
Wollen Sie mehrere Pakete gleichzeitig installieren, so stellen Sie das erste Playbook etwas um. Die Sektion Tasks sieht dann so aus wie in Listing 4
Listing 4
Mehrere Pakete
tasks:
- name: "install packages"
package:
name:
- "Paket1"
- "Paket2"
[...]
Das erste einfache Beispiel wollen wir nun etwas erweitern und in local.yml ein weiteres Play anlegen. Es geht um die Verwaltung von Dotfiles, also den versteckten Dateien in unserem Home. Nehmen wir als Beispiel die Datei .bashrc. Sie ist oft über Jahre gewachsen, wird ab und an editiert und bei einer Neuinstallation des Betriebssystems auf anderen Geräten oft übernommen. Hier kann Ansible die Änderungen verteilen und die Datei nach Neuinstallationen auf neue Geräte übertragen.
Den Code, den Sie dazu in die local.yaml unten anhängen, sehen Sie in Listing 5. Der Parameter src bezeichnet die Quelle und dort den Eintrag files/bashrc. Sie müssen also, damit das hier verwendete Modul copy weiß, was es kopieren soll, im Ordner ~/ansible-desktop/ das Unterverzeichnis files/ anlegen und ihre .bashrc dort hineinkopieren. Das restliche Vorgehen gleicht dem aus dem ersten Beispiel.
Listing 5
.bashrc verwalten
---
- name: "copy .bashrc file"
copy:
src: "files/bashrc"
dest: "/home/Benutzername/.bashrc"
owner: "Benutzername"
group: "Benutzername"
Dabei sind Sie keineswegs auf die .bashrc beschränkt, sondern können alle Konfigurationsdateien dort einfügen, die Sie auf anderen Maschinen verteilen möchten.
System aktualisieren
Für die gängigen Distributionen mit Paketmanagern auf DEB- oder RPM-Basis bietet Ansible eigene Module an (apt und yum), die auch komplette Upgrades des Betriebssystems unterstützen. Diese Module sollten Sie generell dem Modul packages vorziehen, sofern die Zielplattform das jeweilige Paketformat unterstützt.
In einem Playbook sieht die Paketinstallation per Apt-Modul [14] so aus wie in Listing 6 (Abbildung 9), ein Update aller Pakete erledigt der Playbook-Eintrag aus Listing 7 (Abbildung 10). Wünschen Sie eine Liste der installierten, aktualisierten oder entfernten Pakete, so erhöhen Sie den Detailgrad der Ausgabe mit den Schaltern -v bis -vvvv.
Listing 6
Apt-Paketinstallation
- name: "Aktualisiere die Quellenliste und installiere 'foo'"
apt:
name: "foo"
update_cache: "yes"

Abbildung 9: Die erweiterte Fassung unseres Playbooks aktualisiert Debian-Systeme und deren Verwandschaft über Ansibles Apt-Modul. Analog funktioniert das für RPM-basierte Systeme mit dem Yum- oder DNF-Modul.
Listing 7
Apt-Upgrade
- name: "Aktualisiere die Quellenliste und anschließend alle Pakete"
apt:
upgrade: "dist"
update_cache: "yes"

Abbildung 10: Auch hier zeigt Ansible nach dem abgeschlossenen System-Upgrade den Erfolg an. Eine zunehmend detailliertere Ausgabe erhalten Sie über die Parameter -v bis -vvvv.
Tausende Playbooks
Weitere Plays, die tiefer in die Materie einführen, finden Sie im Wiki von LearnLinux.tv [15]. Ein Video, das die einzelnen Plays erklärt, wartet bei YouTube [16] auf Sie. Dort wird unter anderem mit wenigen Zeilen ein separater User für Ansible angelegt, der per Cronjob automatisch alle zehn Minuten alle Plays und Playbooks ausführt, sofern es seit dem letzten Lauf Änderungen gab.
Die in diesem Artikel angeführten Beispiele haben wir sehr einfach gehalten, alles spielt sich in der Datei local.yml ab. Komplexere Playbooks, die Sie auf verschiedenen lokalen oder entfernten Rechnern ausführen wollen, benötigen ein sogenanntes Inventory, das die einzelnen Maschinen beschreibt, die das Playbook referenziert.
Beim Ausführen von Playbooks bekommen Sie gelegentlich Fehlermeldungen zu sehen, die auf Syntaxfehler im YAML-Code hinweisen. Diesen Fehlern gehen Sie nach, indem Sie die Webseite YAMLLint [17] besuchen und dort den Code überprüfen lassen. Als Hinweis zur Notation: Die Verwendung von Anführungszeichen in Ansible war für uns nicht nachvollziehbar dokumentiert. Da aber ohne deren Verwendung des Öfteren Syntaxfehler auftraten, haben wir sie hier eingefügt.
Fazit
Bei Ansible handelt es sich um ein sehr mächtiges Tool, das ganze Rechnerflotten mit unterschiedlichen Architekturen und Betriebssystemen verwalten kann. Wie unsere einfachen Beispiele zeigen, eignet es sich aber auch gut für das heimische Netz, sofern dort mehr als ein Gerät zum Einsatz kommt. So können Sie neben der Aktualisierung und Konfiguration Ihrer Desktops und Notebooks beispielsweise auch neu hinzugekommene Medieninhalte automatisch in die Medienverwaltung Ihres NAS kopieren. Eigenen Ideen sind hier kaum Grenzen gesetzt.
Die Lernkurve über die hier gezeigten Beispiele hinaus gerät nicht allzu steil. Sie lässt sich von jedem bewältigen, der seine Rechner zu mehr nutzt als zum Surfen und zum Schreiben von E-Mails. Die schiere Menge an Informationen und Anleitungen zu Teilaspekten von Ansible im Internet kann das eigene Aufnahmevermögen allerdings schnell sprengen. Wer jedoch ausdauernd sucht, der findet in aller Regel genau das Playbook oder die Anleitung dazu, die ein individuelles Problem einer Lösung zuführt. (jlu)
Infos
-
Ansible Tower: https://www.dev-insider.de/ansible-awx-und-ansible-tower-im-ueberblick-a-716788/
-
Ansible AWX: https://github.com/ansible/awx
-
AWX Install: https://github.com/ansible/awx/blob/devel/INSTALL.md
-
Playbook-Beispiele: https://github.com/ansible/ansible-examples
-
Community-Playbooks: https://github.com/do-community/ansible-playbooks
-
Ansible Galaxy: https://galaxy.ansible.com/
-
Geerling: https://ansible.jeffgeerling.com/#roles
-
Nextcloud mit Docker: https://github.com/spantaleev/nextcloud-docker-ansible-deploy
-
Nextcloud ohne Docker:https://github.com/ReinerNippes/nextcloud/tree/nextcloud-reloaded
-
Pip: https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html
-
Repository: https://legacy.thomas-leister.de/github-fuer-anfaenger-repository-anlegen-und-code-hochladen/
-
Git: https://www.ionos.de/digitalguide/websites/web-entwicklung/git-tutorial/
-
Apt-Modul: https://docs.ansible.com/ansible/2.3/apt_module.html
-
Wiki: https://wiki.learnlinux.tv/index.php/Using_Ansible_to_configure_your_Desktops_and_Laptops
-
YouTube: https://www.youtube.com/watch?v=gIDywsGBqf4&t=2083s
-
YAMLLint: https://yamllint.com





