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.