ADMIN

2023

08

2023-07-28T12:00:00

Remote Work

PRAXIS

062

Open-Source-Tipp

Linux

Ansible

Linux mit Systemrollen konfigurieren

Konfiguration nach Drehbuch

von Thorsten Scherf

Veröffentlicht in Ausgabe 08/2023 - PRAXIS

Mithilfe von Ansible können Sie Ihre Systemlandschaft konfigurieren, verwalten und auf dem aktuellen Stand halten. Die Linux System Roles machen sich dies zunutze, um mittels Ansible-Rollen und -Modulen eine Vielzahl typischer Dienste und Settings auf einem Linux-System einzurichten. Welche Verwaltungstools dabei auf den einzelnen Rechnern zum Einsatz kommen, ist nebensächlich.

Die Linux System Roles [1] decken verschiedene Bereiche der Systemadministration ab. Dazu gehören die Benutzerverwaltung, Netzwerkkonfiguration, Paketinstallation, Dateisystemverwaltung, Sicherheit und einige weitere. Jede Rolle konzentriert sich dabei auf einen bestimmten Bereich und bietet eine Reihe von Modulen und Skripten an, um die entsprechenden Aufgaben zu erledigen.
Ein großer Vorteil der Linux System Roles besteht darin, dass sie auf bewährte Methoden und Technologien zurückgreifen, um die erforderlichen Aufgaben durchzuführen. So kommen Standardbibliotheken wie beispielsweise dbus oder libnm zum Einsatz anstatt Kommandozeilentools. Somit bieten die Linux System Roles einen standardisierten Ansatz für die Verwaltung, der die Wiederholbarkeit und die Einhaltung bewährter Verfahren gewährleistet.
Dies hilft bei der Systemkonfiguration enorm, wenn beispielsweise unterschiedliche Softwarekomponenten für den gleichen Softwarestack zuständig sein können. So erkennt die Linux System Role zur Konfiguration des Netzwerkes etwa, ob auf einem Rechner der NetworkManager oder klassische init-Skripte zum Einsatz kommen. Als Administrator können Sie sich somit darauf beschränken, lediglich die wichtigsten Parameter wie IP-Adresse, Gateway oder DNS-Server zu übergeben. Das Einbinden dieser Parameter in die Konfiguration des Netzwerkstacks geschieht transparent im Hintergrund, da sich die jeweilige Ansible-Rolle und die dazugehörigen Module und Skripte darum kümmern.
Die Linux System Roles [1] decken verschiedene Bereiche der Systemadministration ab. Dazu gehören die Benutzerverwaltung, Netzwerkkonfiguration, Paketinstallation, Dateisystemverwaltung, Sicherheit und einige weitere. Jede Rolle konzentriert sich dabei auf einen bestimmten Bereich und bietet eine Reihe von Modulen und Skripten an, um die entsprechenden Aufgaben zu erledigen.
Ein großer Vorteil der Linux System Roles besteht darin, dass sie auf bewährte Methoden und Technologien zurückgreifen, um die erforderlichen Aufgaben durchzuführen. So kommen Standardbibliotheken wie beispielsweise dbus oder libnm zum Einsatz anstatt Kommandozeilentools. Somit bieten die Linux System Roles einen standardisierten Ansatz für die Verwaltung, der die Wiederholbarkeit und die Einhaltung bewährter Verfahren gewährleistet.
Dies hilft bei der Systemkonfiguration enorm, wenn beispielsweise unterschiedliche Softwarekomponenten für den gleichen Softwarestack zuständig sein können. So erkennt die Linux System Role zur Konfiguration des Netzwerkes etwa, ob auf einem Rechner der NetworkManager oder klassische init-Skripte zum Einsatz kommen. Als Administrator können Sie sich somit darauf beschränken, lediglich die wichtigsten Parameter wie IP-Adresse, Gateway oder DNS-Server zu übergeben. Das Einbinden dieser Parameter in die Konfiguration des Netzwerkstacks geschieht transparent im Hintergrund, da sich die jeweilige Ansible-Rolle und die dazugehörigen Module und Skripte darum kümmern.
Damit vermeiden Sie nicht nur Fehler in der Konfiguration, sondern gehen auch sicher, dass die Einstellungen auf allen Systemen identisch sind und keine individuellen Anpassungen enthalten. Das hilft später beim Troubleshooting, sollte irgendetwas nicht mehr wie gewohnt funktionieren.
Automatisierer Ansible als Grundlage
Wie eingangs erwähnt, basieren die Linux System Roles auf dem Automatisierungswerkzeug Ansible [2]. Von daher ist es hilfreich, sich zuerst einmal einen Überblick über die verschiedenen Artefakte zu verschaffen, mit denen die Open-
Source-Software typischerweise arbeitet. Im Kern nutzt Ansible ein Playbook und ein Inventory. Letzteres enthält eine Übersicht an Systemen, die das Tool verwaltet.
Welche Aktionen auf diesen Systemen stattfinden, ist in einem Playbook definiert. Zur Ausführung können Sie einzelne Befehle oder auch komplexere Skripte einsetzen. Ansible selbst stellt hierfür Python- und für Windows-Systeme PowerShell-Skripte zur Verfügung.
Anstatt in einem Ansible-Playbook nun einzelne Tasks anzustoßen, um bestimmte Aufgaben auszuführen, können Sie stattdessen auch auf Rollen zurückgreifen. Dies hilft bei der Abstraktion von Aufgaben, die Sie ausführen möchten, und bietet somit auch die Möglichkeit, die Aufgaben aus unterschiedlichen Playbooks heraus aufzurufen.
Um eine bestimmte Aufgabe auf einer Reihe von Systemen durchzuführen, verteilen Sie diese von einem Control-Node aus. Dieser benötigt SSH-Zugang zu den zu verwaltenden Systemen. Die Linux System Roles werden dafür auf diesem Control-Node installiert. Auf den "managed Nodes" hingegen müssen diese nicht vorhanden sein. Der Control-Node erhält zusätzlich eine Inventory-Datei mit einer Übersicht der "managed Nodes". Im einfachsten Fall kann dies eine Übersicht sämtlicher Systeme sein, tatsächlich ergibt es aber Sinn, die Systeme nach bestimmten Eigenschaften zu gruppieren. Nachfolgend ein Beispiel für eine einfache Inventardatei:
[idm]
idm.ipa.test
keycloak.ipa.test
[fedora]
f38-apache.fedora.ipa.test
f37-mariadb.fedora.ipa.test
Systemrollen per Paketmanager installieren
Die Linux System Roles installieren Sie auf CentOS oder Fedora einfach mittels des Paketmanagers dnf aus dem Standard-Software-Repository heraus mit dnf install linux-system-roles. Unter Red Hat Enterprise Linux heißt das Paket "rhel-system-roles", das Sie ebenfalls mithilfe von dnf oder wahlweise aus dem Ansible Automation Hub (AAH) einspielen, sofern Sie diese Software einsetzen.
Und schließlich können Sie die Ansible Rollen aus Ansible Galaxy [3] sowie dem GitHub-Repository [4] laden. Natürlich ist ebenfalls das Paket "ansible-core" notwendig. Sollte dieses noch nicht installiert sein, wird es automatisch als Abhängigkeit von den Linux System Roles mitinstalliert. Zu beachten ist in jedem Fall, dass die Systemrollen aktuell lediglich unter Cent­OS, Fedora und Red Hat Enterprise Linux unterstützt werden. Sollten Sie die Rollen auf einem anderen Linux-Derivat einsetzen wollen, sind an der einen oder anderen Stelle manuelle Anpassungen notwendig.
Bevor Sie nun mit dem Deployment einer Systemrolle beginnen, sollten Sie in jedem Fall sicherstellen, dass Sie von Ihrem Ansible-Control-Node auch Zugriff auf die gewünschten managed-Nodes haben. Im einfachsten Fall überprüfen Sie die Konnektivität mit dem Ansible-Ping-Modul:
ansible idm -m ping -i inventory
idm.ipa.test | SUCCESS => {
      "ansible_facts": {
           "discovered_interpreter_python": "/usr/bin/python3"
      },
      "changed": false,
      "ping": "pong"
}
keycloak.ipa.test | SUCCESS => {
      "ansible_facts": {
           "discovered_interpreter_python": "/usr/bin/python3"
      },
      "changed": false,
      "ping": "pong"
}
Melden alle Systeme ein "SUCCESS", ist alles in Ordnung und Sie können sich an die Konfiguration der ersten Systemrolle machen.
YAML-Datei "chrony.conf"
### Die Datei /etc/chrony.conf wurde anhand der Anweisungen aus der Linux System Role timesync erstellt.
#
# Ansible managed
#
# system_role:timesync
server 0.pool.ntp.org
server 1.pool.ntp.org
server 2.pool.ntp.org
# Allow the system clock to be stepped in the first three updates.
makestep 1.0 3
# Enable kernel synchronization of the real-time clock (RTC).
rtcsync
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift
# Save NTS keys and cookies.
ntsdumpdir /var/lib/chrony
# Custom settings
logdir /var/log/chrony
log measurements statistics tracking
Praxisbeispiel: Zeitsynchronisation einrichten
Die Linux System Roles bieten für viele unterschiedliche Aufgaben entsprechende Ansible-Rollen und -Module an. Das nachfolgende Listing zeigt ein einfaches Beispiel, um mithilfe der Rolle "linux-system-roles.timesync" eine grundlegende Konfiguration zur Zeitsynchronisation gegenüber verschiedenen Zeitservern vorzunehmen:
- name: Zeitserver Konfiguration
    hosts: idm
    vars:
        timesync_ntp_servers:
             - hostname: 0.pool.ntp.org
             - hostname: 1.pool.ntp.org
             - hostname: 2.pool.ntp.org
        timesync_chrony_custom_settings:
             - "logdir /var/log/chrony"
             - "log measurements statistics tracking"
     roles:
           - linux-system-roles.timesync
In der YAML-Datei im Listing-Kasten erkennen Sie, dass hier lediglich die gewünschten Zeitserver sowie einige Chrony-spezifische Log-Anweisungen aufgeführt sind. Rufen Sie das Playbook nun mittels ansible-playbook ntp.yaml -i inventory auf, werden die Anweisungen auf den managed Nodes ausgeführt. Welche dies im Einzelnen sind, definieren Sie in der Inventory-Datei. Die Angabe "idm" im Playbook bezieht sich dabei auf die gleichnamige Gruppe aus dem Inventory.
Fazit
Wer einen ganzen Fuhrpark an Linux-Rechnern zu verwalten hat, ist freilich für jede Form der Automatisierung dankbar. Mit den Linux System Roles konfigurieren Sie sehr einfach unterschiedliche Bereiche eines Linux-Systems. Kenntnisse der dabei im Einzelnen eingesetzten Software sind hierfür nicht notwendig, da mithilfe von Ansible-Rollen eine Abstraktion stattfindet und Sie sich somit lediglich auf die Übergabe der eigentlichen Konfigurationsparameter innerhalb eines Ansible-Playbooks beschränken können.
In diesem Open-Source-Tipp haben wir gezeigt, wie die Systemrollen funktionieren und sich für Konfigurationsaufgaben nutzen lassen. Die ausführliche Dokumentation zu den Linux System Roles finden Sie auf der GitHub-Seite des Projekts unter [4].
(dr)
Link-Codes
[4] GitHub Repository Linux System Roles: https://github.com/linux-system-roles/