Wie man Ansible unter Ubuntu 20.04 installiert und konfiguriert

Ansible ist ein sehr beliebtes Konfigurationsmanagement-Tool, das die Steuerung einer großen Anzahl von Servern vereinfacht. Du kannst von einem einzigen Knoten aus beliebig viele Server steuern und Prozesse auf ihnen gleichzeitig ausführen.

Ansible erfordert keine spezielle Software, die auf den Serverknoten installiert werden muss, und kann sie über SSH steuern.

In dieser Anleitung lernen wir, wie man Ansible auf einem Ubuntu 20.04 Server installiert und konfiguriert.

Voraussetzungen

  • Zwei oder mehr Ubuntu 20.04 basierte Serversysteme mit installiertem OpenSSH-Server.
  • Sowohl der Server als auch die Nodes sind über öffentliche IP-Adressen erreichbar.
  • Ein Nicht-Root-Benutzer mit sudo-Rechten auf dem Ansible-Server und ein Root-Benutzer mit einem Passwort auf den Ansible-Clients.

Ansible installieren

Das offizielle Repository von Ansible unterstützt Ubuntu 20.04 nicht. Grund dafür ist ein Fehler in der Python-Bibliothek von Ubuntu, der zum Zeitpunkt der Erstellung dieses Tutorials auftrat.

Glücklicherweise wird Ubuntu mit Ansible 2.9 ausgeliefert, das wir installieren werden. Führe den folgenden Befehl aus, um Ansible zu installieren.

$ sudo apt install ansible -y

Teste deine Installation, indem du den folgenden Befehl ausführst.

$ ansible --version
ansible 2.9.6
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/username/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.8.5 (default, Jan 27 2021, 15:41:15) [GCC 9.3.0]

Einrichten der Inventarisierungsdatei

Damit du dich mit mehreren Hosts verbinden kannst, brauchst du eine Datei, in der die Details der Knoten festgehalten werden. Diese Datei wird Inventory-Datei genannt.

Je nachdem, wie viele Server du kontrollieren willst, kannst du sie in der Inventory-Datei von Ansible auch in Gruppen und Untergruppen anordnen. Du kannst auch benutzerdefinierte Variablen für bestimmte Hosts oder Gruppen festlegen, die bei der Weitergabe der Anweisungen weiter verwendet werden können.

Ansible wird mit einer Standard-Inventardatei ausgeliefert, die du unter /etc/ansible/hosts findest. Öffne sie mit dem Nano-Editor.

$ sudo nano /etc/ansible/hosts

Füge den folgenden Code am Ende der Datei ein.

[servers]
server1 ansible_host=203.0.113.111
server2 ansible_host=203.0.113.112
server3 ansible_host=203.0.113.113

[all:vars]
ansible_python_interpreter=/usr/bin/python3

Der Abschnitt servers definiert die Liste der Knoten, mit denen du dich verbinden willst. Du kannst beliebig viele Gruppen erstellen, um Server in mehreren Gruppen anzuordnen.

Die Gruppe all:vars setzt den Parameter ansible_python_interpreter auf allen Hosts im Inventar. Sie stellt sicher, dass Ansible Python 3 verwendet und nicht Python 2, das aus den letzten Ubuntu-Versionen entfernt wurde.

Wenn du fertig bist, speichere und schließe die Datei, indem du CTRL+X und dann Y und ENTER drückst, um deine Änderungen zu bestätigen.

Hinweis: Du kannst auch eine eigene Inventardatei an einem beliebigen Ort deiner Wahl erstellen, die du dann beim Ausführen von Ansible-Befehlen mit dem Parameter -i weitergeben kannst.

Du kannst deine Inventarliste mit dem folgenden Befehl überprüfen.

$ ansible-inventory --list -y
all:
  children:
    servers:
      hosts:
        server1:
          ansible_host: 203.0.113.111
          ansible_python_interpreter: /usr/bin/python3
        server2:
          ansible_host: 203.0.113.112
          ansible_python_interpreter: /usr/bin/python3
        server3:
          ansible_host: 203.0.113.113
          ansible_python_interpreter: /usr/bin/python3
    ungrouped: {}

Einteilung der Server in Gruppen und Untergruppen

Dies ist ein nützlicher Tipp, wenn du viele Server hast, von denen einige bestimmte Funktionen erfüllen. Du kannst mit dieser Methode zum Beispiel Webserver und Datenbankserver getrennt gruppieren. Du kannst sogar einen Host in mehrere Gruppen einteilen. Du kannst sogar einen Host in mehrere Gruppen einteilen. Um das zu erreichen, sollte deine Inventardatei etwa so aussehen wie die folgende.

[webservers]
203.0.113.111
203.0.113.112

[dbservers]
203.0.113.113
server_hostname

[development]
203.0.113.111
203.0.113.113

[production]
203.0.113.112
server_hostname

SSH-Schlüssel einrichten

Damit Ansible sich mit den Servern verbinden kann, musst du SSH-Schlüssel zwischen deinem Ansible-Server und den in der Inventardatei angegebenen Hosts einrichten. Das funktioniert nur, wenn die Ansible-Clients keinen öffentlichen Schlüssel und ein Root-Konto mit einem Passwort aktiviert haben.

Gehe wie folgt vor, um einen SSH-Schlüssel für Ansible und seine Knoten zu erstellen und einzurichten.

Erstelle den Schlüssel für Ansible.

$ ssh-keygen -t rsa -b 4096 -C "Ansible key"

Kopiere den öffentlichen Schlüssel auf deine Konten auf den Remote-Servern. Hierfür verwenden wir den Befehl ssh-copy-id.

$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub root@203.0.113.111
$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub root@203.0.113.112
$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub root@203.0.113.113

Das war’s schon. Jetzt sollte Ansible in der Lage sein, mit deinen Servern zu kommunizieren.

SSH-Schlüssel auf Knoten mit vorhandenem öffentlichen Schlüssel einrichten

Wenn auf den Clients bereits öffentliche Schlüssel aktiviert sind, musst du einige zusätzliche Schritte ausführen. Dazu musst du auf jedem Node-Server einen neuen Benutzer anlegen, auf den nur Ansible Zugriff hat. Dieser Benutzer hat sudo-Rechte, auf die er ohne Passwort zugreifen kann, und kann nur von deinem Ansible-Server aus angesprochen werden.

Um einen ansible Benutzer zu erstellen, führe den folgenden Befehl aus.

$ sudo adduser ansible

Wähle ein sicheres Passwort und lasse alle anderen Felder leer.

Konfiguriere nun den passwortlosen sudo-Zugang für diesen Benutzer mit dem folgenden Befehl.

$ echo "ansible ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ansible

Nachdem du den neuen Benutzer hinzugefügt und konfiguriert hast, kannst du den SSH-Schlüssel mit folgendem Befehl von deinem Ansible-Server auf den Node-Server kopieren.

$ ssh-copy-id ansible@203.0.113.111

Du wirst aufgefordert, ein Passwort für den ansible-Benutzer einzugeben. Gib es ein und der SSH-Schlüssel wird kopiert.

Als Nächstes deaktivierst du die passwortbasierte Anmeldung für den Benutzer ansible auf dem Node-Server.

$ sudo usermod -L ansible

Jetzt ist dein Node-Server nur noch vom Ansible-Server aus erreichbar, da nur dieser Server den öffentlichen Schlüssel dafür hat und du ihn nicht direkt mit sudo-Rechten auf dem Node-Server benutzen kannst, da die Passwortanmeldung deaktiviert ist.

Du musst diese Schritte für jeden Node-Server wiederholen. Ersetze außerdem den Benutzer root durch den Benutzer ansible in diesem Tutorial.

Verbindung testen

Nachdem wir die Inventardatei und die SSH-Schlüssel eingerichtet haben, sollten wir überprüfen, ob Ansible sich mit den Servern verbinden kann.

Gib den folgenden Befehl ein, um die Verbindung zu prüfen. Mit diesem Befehl wird die Verbindung zu allen Servern aus der Inventardatei getestet.

$ ansible all -m ping -u root

Dieser Befehl verwendet das Ping-Modul von Ansible, um die Verbindung zu allen Servern zu testen. Du solltest eine Ausgabe wie die folgende erhalten.

server1 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
server2 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
server3 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

Wenn du Ansible zum ersten Mal verwendest, wirst du aufgefordert, die Authentizität aller Server zu bestätigen. Wenn du dazu aufgefordert wirst, gib yes ein und drücke zur Bestätigung ENTER.

Einige grundlegende Befehle ausführen

Lass uns mit Ansible einige grundlegende Befehle auf den Servern ausführen. Um einen beliebigen Befehl auf dem Server auszuführen, wird das folgende Format verwendet.

$ ansible all -a "command" -u <username>

Festplattenauslastung prüfen

Als Erstes überprüfen wir die Festplattennutzung auf allen unseren Servern.

$ ansible all -a "df -h" -u root
server1 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            3.9G     0  3.9G   0% /dev
tmpfs           798M  624K  798M   1% /run
/dev/vda1       155G  2.3G  153G   2% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/vda15      105M  3.6M  101M   4% /boot/efi
tmpfs           798M     0  798M   0% /run/user/0

server2 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           395M  608K  394M   1% /run
/dev/vda1        78G  2.2G   76G   3% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/vda15      105M  3.6M  101M   4% /boot/efi
tmpfs           395M     0  395M   0% /run/user/0

Einzelne Hosts und Gruppen anvisieren

Bis jetzt haben wir die Befehle auf allen Remote-Servern gleichzeitig ausgeführt. Das ist aber nicht immer der Fall. Um einen Befehl nur auf einem Server auszuführen, solltest du das folgende Format verwenden.

$ ansible server1 -a "uptime" -u root
server1 | CHANGED | rc=0 >>
 21:38:26 up 11 min,  2 users,  load average: 0.00, 0.20, 0.19

Der obige Befehl prüft die Betriebszeit auf Server1 aus der Bestandsgruppe.

Du kannst auch mehrere Server mit folgendem Format abfragen.

$ ansible server1:server2 -m ping -u root

Du kannst auch Gruppen oder Untergruppen direkt aus der Inventardatei ansteuern.

$ ansible groupname -m ping -u <username>

Alle Server aktualisieren

In diesem Tutorial gehen wir davon aus, dass alle entfernten Server mit Debian oder Ubuntu betrieben werden.

Führe den folgenden Befehl aus, um die Software auf all deinen Servern zu aktualisieren.

$ ansible all -m apt -a "update_cache=yes upgrade=yes" -u root

-m parameter definiert das Modul, das Ansible ausführen soll. -a bezieht sich auf die Argumente oder Befehle für das zugehörige Modul. Hier verwenden wir das Modul apt von Ansible, um die Server zu aktualisieren, genauso wie wir das Modul ping in unserem letzten Beispiel verwendet haben. update_cache aktualisiert den APT-Cache auf dem Server und upgrade=yes weist Ansible an, den Befehl apt upgrade auszuführen.

Um deine CentOS-Server zu aktualisieren, kannst du denselben Befehl verwenden, indem du apt durch yum und bei Fedora-Servern apt durch dnf ersetzst.

Wenn du, wie oben beschrieben, den Benutzer ansible verwendest, musst du den Befehl ansible so ändern, dass er mit erweiterten sudo-Rechten ausgeführt wird.

$ ansible server2 -m apt -a "update_cache=yes upgrade=yes" -K -b -u ansible

Hier fragt -K nach dem Passwort für die Privilegienerweiterung. -b führt die Ansible-Operation mit become aus, was dir erlaubt, ein anderer Benutzer zu sein. Beide Variablen zusammen ermöglichen es, ansible mit erweiterten sudo-Rechten auszuführen. Du musst dies für alle Befehle verwenden, die sudo-Rechte erfordern.

Manchmal kann es vorkommen, dass einige dieser Update-Befehle einen Neustart erfordern, also führe den folgenden Befehl aus, um alle deine Server neu zu starten.

$ ansible all -a "reboot" -u root

Dies waren nur einige der grundlegenden Befehle, die du mit Ansible ausführen kannst.

Fazit

Damit ist unser Tutorial zur Installation und Konfiguration von Ansible auf einem Ubuntu 20.04 basierten Server beendet. Wenn du Fragen hast, schreibe sie unten in die Kommentare.

Das könnte dich auch interessieren …