Ansible ist ein Werkzeug um Linux-Systeme aus der Ferne anzupassen. Gerade in Unternehmen haben Administratoren es oft mit dem Aufsetzen und dem Anpassen von Betriebssystemen zu tun – ja, auch Linux läuft in Unternehmen – auch in recht großen. Und ja, ich habe damit zu tun.
Ansible hat den Vorteil – man kann damit nicht nur ein System auf einem Mal konfigurieren, dies ist etwa bei SSH (Secure Shell) der Fall. Mittels Ansible kann ich beliebig viele Linux-Systeme zur gleichen Zeit anpassen.
Gleich einmal zu Beginn, auch mit Ansible arbeitet man am Terminal – und auch hier gilt es zu wissen, was man tut. Dieser Artikel wird nicht an einem Tag fertig sein, bis die ersten groben Themen besprochen sind, bleibt das Thema gesperrt – anschließend kann auch jeder beitragen.
Ansible ist übrigens die Distribution vollkommen egal – Sie können mit einem Debian, Ubuntu oder openSUSE warten und umgekehrt. Optimal genutzt wird Ansible, wenn die Clients statische IP-Adressen haben.
Ansible installieren
Unter auf Debian basierenden Linux-Distributionen installieren Sie diese Software wie üblich über die Paket-Verwaltung durch das Paket „ansible„. Möchten Sie die aktuellste Version der Software nutzen, installieren Sie diese am besten über das Python-Repository durch das Paket „ansible„.
Den Server vorbereiten
Zu Beginn gilt es einen Rechner auszuwählen, dieser dient als Server – so gesehen als Wartungsmaschine für die anderen Rechner, die es zu konfigurieren gilt. Auf diesem wird auch Ansible installiert. Wichtig natürlich – auf den Clients muss man einen administrativen Zugang haben.
Auf diesem erstellt man sich jetzt unter „/etc/ansible/“ – das Verzeichnis gilt es erst manuell anzulegen – am einfachsten als Admin am Terminal:
mkdir /etc/ansible
Dort erstellt man sich eine „hosts„-Datei, ebenfalls am Terminal, mit administrativen Rechten:
touch /etc/ansible/hosts
Diese Datei befüllt man anschließend mit den entsprechenden Hostnamen – wieder mit administrativen Rechten am Terminal:
nano /etc/ansible/hosts
Ein Beispiel:
host_1
host_2
host_3
Die Datei wird mit Strg+o gespeichert, mit Eingabe wird bestätigt und mit Strg+x wird der Editor geschlossen.
Anschließend legt man auf dem Server – etwa im Home-Verzeichnis eine Datenbank an – eine reine Textdatei mit der Endung „.yaml„. Diese befüllt man anschließend nach folgendem Schema:
all:
hosts:
client_1:
ansible_host: client_1
ansible_host: client_2
ansible_host: client_3
Ich nenne die Datei jetzt ganz einfach einmal „inventory.yaml„. Bevor man mit Ansible auf den entfernten Rechnern arbeiten kann, gilt es Informationen über diese zu sammeln. Dies geschieht über den Befehl:
ansible -i inventory.yaml client_1 -m setup
Dies wird mit jedem Client wiederholt – es kann jetzt einige Sekunden dauern, bis man Informationen erhält. Die Daten werden für jeden Client automatisch gespeichert.
Zur Sicherheit lässt sich später jeder Rechner anpingen:
ansible -i inventory.yaml all -m ping
Jetzt können wir gleich einmal versuchen auf einem der Clients oder allen ein Paket zu installieren, ich nehme jetzt einfach einmal das Paket „zsh“ – so lernen wir gleich einmal die Syntax ein wenig kennen.
ansible -i inventory.yaml client_1 -m package -a "name=zsh state=present" -b --ask-become-pass
Dasselbe mit allen Clients:
ansible -i inventory.yaml clients -m package -a "name=zsh state=present" -b --ask-become-pass
Mit „-i“ geben wir die Datenbank an, mit „-m
“ das Modul – in diesem Beispiel nennt sich das Modul „package“ – für Software-Pakete. Mit „-a
“ geben wir Argumente für das Modul an – handelt es sich um mehrere Argumente, setzt man diese unter Anführungszeichen. In diesem Beispiel sind es die Argumente „name=“ (um den Namen des Paketes anzugeben) und „state=“ den Status.
Ansible will wissen, was sein soll, wenn die Arbeit abgeschlossen ist – in diesem Fall „present“ – das Paket soll zum Abschluss also installiert sein.
Mit der Option „-b
“ erzeugt man eine „privilege escalation“ – diese ermöglicht es etwa ein Paket zu installieren. Durch „--ask-become-pass
“ erfolgt die Abfrage des root-Passwortes.
SSH-Login-Begrüßung anpassen
Zum Anpassen der SSH-Login-Begrüßung ist die Datei „/etc/motd“ verantwortlich – die Datei muss unter Umständen erst angelegt werden. Um komplette Zeilen auszutauschen, das Ansible-Modul „blockinfile„. Um mehrere Aufgaben auf einmal zu erledigen erstellt man sich ein Playbook – einfach eine Textdatei mit der Endung „.yaml„.
Playbook-Inhalt:
- hosts: all
tasks:
- name: Leere Datei "/etc/motd" erstellen
file:
path: "/etc/motd"
state: touch
become: yes
- name: Datei "/etc/motd" mit Begrüßung befüllen
blockinfile:
dest: /etc/motd
block: |
Neue Begrueßung von Robert Goedl auf rechnername!
Wichtig – bei YAML auf die Einrückungen (zwei Leerzeichen) achten.
Jetzt wird die Aufgabe ausgeführt:
ansible-playbook playbook.yaml -i inventory.yaml -b --ask-become-pass
Die Zeile ‚Neue Begrueßung von Robert Goedl auf rechnername!‘ löschen:
Das Playbook:
- hosts: all
tasks:
- name: Zeile 'Neue Begrueßung von Robert Goedl auf rechnername!' aus '/etc/motd' entfernen
lineinfile:
dest: /etc/motd
regexp: Neue Begrueßung von Robert Goedl auf rechnername!
state: absent
Die Zeile “Neue Begrueßung von Robert Goedl auf rechnername!‘ durch ‚Alte Begrüßung ersetzt!‘ ersetzen.
Das Playbook:
- hosts: all
tasks:
- name: Zeile 'Neue Begrueßung von Robert Goedl auf rechnername!' durch 'Alte Begrüßung ersetzt!' ersetzen.
lineinfile:
path: /etc/motd
search_string: 'Neue Begrueßung von Robert Goedl auf rechnername!'
line: Alte Begrüßung ersetzt!
Eine Reaktion
[…] ich jetzt seit zwei Jahren auch beruflich unter und mit Linux arbeite, kommt mir natürlich auch Ansible unter die Finger. Mit Ansible (siehe erster Link, eine kurze erste Anleitung auf der Linux Bibel) […]