Ansible ist eine vollständige Automatisierungslösung für Ihre IT-Umgebung. Mit Ansible können Sie die Linux- und Windows-Serverkonfiguration automatisieren, die Dienstbereitstellung orchestrieren, Cloud-Umgebungen bereitstellen und sogar Ihre Netzwerkgeräte konfigurieren.
Ansible-Module abstrahieren Aktionen auf Ihrem System, sodass Sie sich nicht um Implementierungsdetails kümmern müssen. Sie beschreiben einfach den gewünschten Zustand und Ansible sorgt dafür, dass das Zielsystem dazu passt.
Diese Modulverfügbarkeit ist einer der Hauptvorteile von Ansible, und es wird oft als Ansible mit „inklusive Batterien“ bezeichnet. Tatsächlich gibt es Module für eine Vielzahl von Aufgaben, und obwohl das großartig ist, höre ich häufig von Anfängern, dass sie nicht wissen, wo sie anfangen sollen.
Obwohl Ihre Wahl der Module ausschließlich von Ihren Anforderungen und dem, was Sie mit Ansible automatisieren möchten, abhängt, sind hier die zehn wichtigsten Module, die Sie für den Einstieg in Ansible für die Linux-Systemautomatisierung benötigen.
1. kopieren
Mit dem Kopiermodul können Sie eine Datei vom Ansible-Steuerknoten auf die Zielhosts kopieren. Zusätzlich zum Kopieren der Datei können Sie damit Eigentum, Berechtigungen und SELinux-Labels für die Zieldatei festlegen. Hier ist ein Beispiel für die Verwendung des Kopiermoduls zum Kopieren einer "Nachricht des Tages"-Konfigurationsdatei auf die Zielhosts:
- name:Stellen Sie sicher, dass die MOTD-Datei vorhanden ist
copy:
src:files/motd
dest:/etc/motd
owner:root
group:Root
-Modus:0644
Bei weniger komplexen Inhalten können Sie den Inhalt direkt in die Zieldatei kopieren, ohne eine lokale Datei zu haben, wie hier:
- Name:Stellen Sie sicher, dass die MOTD-Datei vorhanden ist
Kopie:
Inhalt:"Willkommen bei diesem System."
Ziel:/etc/motd
Eigentümer:root
Gruppe:Root
Modus:0644
Dieses Modul arbeitet idempotent, d. h. es kopiert die Datei nur, wenn dieselbe Datei nicht bereits mit demselben Inhalt und denselben Berechtigungen vorhanden ist.
Das Kopiermodul ist eine großartige Option, um eine kleine Anzahl von Dateien mit statischem Inhalt zu kopieren. Wenn Sie eine große Anzahl von Dateien kopieren müssen, werfen Sie einen Blick auf das Synchronisierungsmodul. Um Dateien mit dynamischem Inhalt zu kopieren, werfen Sie einen Blick auf die template
Modul weiter.
2. Vorlage
Das Template-Modul funktioniert ähnlich wie das copy
Modul, aber es verarbeitet Inhalte dynamisch unter Verwendung der Vorlagensprache Jinja2, bevor es auf die Zielhosts kopiert wird.
Definieren Sie beispielsweise eine Vorlage "Nachricht des Tages", die den Namen des Zielsystems anzeigt, wie folgt:
$ vi templates/motd.j2
Willkommen bei {{ Inventory_Hostname }}.
Instanziieren Sie dann diese Vorlage mit template
Modul, etwa so:
- name:Stellen Sie sicher, dass die MOTD-Datei vorhanden ist
template:
src:templates/motd.j2
dest:/etc/motd
owner:root
Gruppe:Root
Modus:0644
Vor dem Kopieren der Datei verarbeitet Ansible die Vorlage, interpoliert die Variable und ersetzt sie durch den Namen des Zielhostsystems. Beispiel:Der Zielsystemname ist rh8-vm03
, die Ergebnisdatei ist:
Willkommen bei rh8-vm03.
Während das copy
Modul kann auch Variablen interpolieren, wenn es den content
verwendet Parameter, die template
-Modul ermöglicht zusätzliche Flexibilität durch das Erstellen von Vorlagendateien, mit denen Sie komplexere Inhalte definieren können, einschließlich for
Schleifen, if
Bedingungen und mehr. Eine vollständige Referenz finden Sie in der Jinja2-Dokumentation.
Dieses Modul ist auch idempotent und kopiert die Datei nicht, wenn der Inhalt auf dem Zielsystem bereits mit dem Inhalt der Vorlage übereinstimmt.
3. Benutzer
Das Benutzermodul ermöglicht Ihnen das Anlegen und Verwalten von Linux-Benutzern in Ihrem Zielsystem. Dieses Modul hat viele verschiedene Parameter, aber in seiner grundlegendsten Form können Sie es verwenden, um einen neuen Benutzer zu erstellen.
Zum Beispiel, um den Benutzer ricardo
zu erstellen mit UID 2001, Teil der Gruppen users
und wheel
und das Passwort mypassword
, wenden Sie den user
an Modul mit diesen Parametern:
- Name:Sicherstellen, dass Benutzer ricardo existiert
Benutzer:
Name:ricardo
Gruppe:Benutzer
Gruppen:Rad
uid:2001
Passwort:"{{ 'mypassword' | password_hash('sha512') }}"
Status:vorhanden
Beachten Sie, dass dieses Modul versucht, idempotent zu sein, dies jedoch nicht für alle seine Optionen garantieren kann. Wenn Sie beispielsweise das vorherige Modulbeispiel erneut ausführen, wird das Kennwort auf den definierten Wert zurückgesetzt, wodurch der Benutzer im System für jede Ausführung geändert wird. Um dieses Beispiel idempotent zu machen, verwenden Sie den Parameter update_password: on_create
, um sicherzustellen, dass Ansible das Passwort nur beim Erstellen des Benutzers und nicht bei nachfolgenden Ausführungen festlegt.
Sie können dieses Modul auch verwenden, um einen Benutzer zu löschen, indem Sie den Parameter state: absent
setzen .
Der user
Das Modul bietet Ihnen viele Optionen, um mehrere Benutzeraspekte zu verwalten. Weitere Informationen finden Sie in der Moduldokumentation.
4. Paket
Das Paketmodul ermöglicht es Ihnen, Softwarepakete mithilfe des Standardpaketmanagers des Betriebssystems zu installieren, zu aktualisieren oder von Ihrem Zielsystem zu entfernen.
Um beispielsweise den Apache-Webserver auf einem Red Hat Linux-Rechner zu installieren, wenden Sie das Modul wie folgt an:
- Name:Stellen Sie sicher, dass das Apache-Paket installiert ist
Paket:
Name:httpd
Status:vorhanden
Mehr zu Ansible
- Eine Schnellstartanleitung für Ansible
- Ansible-Spickzettel
- Kostenloser Online-Kurs:Grundlagen von Ansible
- Ansible herunterladen und installieren
- eBook:Das automatisierte Unternehmen
- eBook:Ansible für DevOps
- Kostenlose Ansible-eBooks
- Neueste Ansible-Artikel
Dieses Modul ist verteilungsunabhängig und funktioniert unter Verwendung des zugrunde liegenden Paketmanagers, wie z. B. yum/dnf
für Red Hat-basierte Distributionen und apt
für Debian. Aus diesem Grund werden nur grundlegende Aufgaben wie das Installieren und Entfernen von Paketen ausgeführt. Wenn Sie mehr Kontrolle über die Optionen des Paketmanagers benötigen, verwenden Sie das spezifische Modul für die Zieldistribution.
Denken Sie auch daran, dass, obwohl das Modul selbst auf verschiedenen Distributionen funktioniert, der Paketname für jede unterschiedlich sein kann. Bei Red Hat-basierten Distributionen lautet der Paketname des Apache-Webservers beispielsweise httpd
, während es in Debian apache2
ist . Stellen Sie sicher, dass Ihre Playbooks damit umgehen.
Dieses Modul ist idempotent und reagiert nicht, wenn der aktuelle Systemzustand mit dem gewünschten Zustand übereinstimmt.
5. Dienst
Verwenden Sie das Dienstmodul, um die Dienste des Zielsystems mit dem erforderlichen Init-System zu verwalten; zum Beispiel systemd.
In seiner einfachsten Form müssen Sie lediglich den Dienstnamen und den gewünschten Status angeben. Zum Beispiel, um sshd
zu starten verwenden Sie das Modul wie folgt:
- Name:Stellen Sie sicher, dass SSHD gestartet ist
Dienst:
Name:sshd
Status:gestartet
Sie können auch sicherstellen, dass der Dienst automatisch gestartet wird, wenn das Zielsystem hochfährt, indem Sie den Parameter enabled: yes
angeben .
Wie beim package
Modul, der service
Modul ist flexibel und funktioniert über verschiedene Distributionen hinweg. Wenn Sie eine Feinabstimmung über das spezifische Ziel-Init-System benötigen, verwenden Sie das entsprechende Modul; zum Beispiel das Modul systemd
.
Ähnlich wie bei den anderen Modulen, die Sie bisher gesehen haben, der service
Modul ist auch idempotent.
6. Firewalld
Verwenden Sie das Modul firewalld, um die System-Firewall mit firewalld
zu steuern Daemon auf Systemen, die ihn unterstützen, wie z. B. Red Hat-basierte Distributionen.
Um beispielsweise den HTTP-Dienst auf Port 80 zu öffnen, verwenden Sie ihn wie folgt:
- Name:Stellen Sie sicher, dass Port 80 (http) geöffnet ist
firewalld:
Dienst:http
Status:aktiviert
permanent:ja
sofort:jaSie können auch benutzerdefinierte Ports anstelle von Dienstnamen mit dem
port
angeben Parameter. Geben Sie in diesem Fall auch das Protokoll an. Um beispielsweise den TCP-Port 3000 zu öffnen, verwenden Sie Folgendes:- Name:Stellen Sie sicher, dass Port 3000/TCP offen ist
firewalld:
Port:3000/tcp
Status:aktiviert
dauerhaft:ja
sofort:jaSie können dieses Modul auch verwenden, um andere
firewalld
zu steuern Aspekte wie Zonen oder komplexe Regeln. Überprüfen Sie unbedingt die Dokumentation des Moduls auf eine umfassende Liste der Optionen.7. Datei
Mit dem Dateimodul können Sie den Status von Dateien und Verzeichnissen steuern und Berechtigungen, Eigentumsrechte und SELinux-Labels festlegen.
Verwenden Sie zum Beispiel die
file
Modul zum Erstellen eines Verzeichnisses/app
gehört dem Benutzerricardo
, mit Lese-, Schreib- und Ausführungsberechtigungen für den Besitzer und die Gruppeusers
:- Name:Stellen Sie sicher, dass das Verzeichnis /app existiert
Datei:
Pfad:/app
Status:Verzeichnis
Eigentümer:ricardo
Gruppe:Benutzer
Modus:0770Sie können dieses Modul auch verwenden, um Dateieigenschaften für Verzeichnisse rekursiv festzulegen, indem Sie den Parameter
recurse: yes
verwenden oder löschen Sie Dateien und Verzeichnisse mit dem Parameterstate: absent
.Dieses Modul arbeitet für die meisten seiner Parameter mit Idempotenz, aber einige von ihnen können dazu führen, dass es den Zielpfad jedes Mal ändert. Weitere Einzelheiten finden Sie in der Dokumentation.
8. lineinfile
Mit dem lineinfile-Modul können Sie einzelne Zeilen in bestehenden Dateien verwalten. Es ist nützlich, die gezielte Konfiguration vorhandener Dateien zu aktualisieren, ohne den Rest der Datei zu ändern oder die gesamte Konfigurationsdatei zu kopieren.
Fügen Sie Ihrer hosts-Datei beispielsweise einen neuen Eintrag wie diesen hinzu:
- Name:Host rh8-vm03 in Hosts-Datei sicherstellen
lineinfile:
path:/etc/hosts
line:192.168.122.236 rh8-vm03
state:presentSie können dieses Modul auch verwenden, um eine bestehende Zeile zu ändern, indem Sie den Parameter
regexp
anwenden um nach einer bestehenden Leitung zu suchen, die ersetzt werden soll. Aktualisieren Sie beispielsweisesshd_config
Datei, um die Root-Anmeldung zu verhindern, indem Sie die ZeilePermitRootLogin yes
ändern aufPermitRootLogin no
:- name:Stellt sicher, dass sich Root nicht über ssh anmelden kann
lineinfile:
path:/etc/ssh/sshd_config
regexp:'^PermitRootLogin'
line:PermitRootLogin no
Status:vorhandenHinweis:Verwenden Sie das Dienstmodul, um den SSHD-Dienst neu zu starten, um diese Änderung zu aktivieren.
Dieses Modul ist ebenfalls idempotent, aber stellen Sie im Falle einer Zeilenänderung sicher, dass der reguläre Ausdruck sowohl dem ursprünglichen als auch dem aktualisierten Zustand entspricht, um unnötige Änderungen zu vermeiden.
9. unarchivieren
Verwenden Sie das Unarchive-Modul, um den Inhalt von Archivdateien wie
tar
zu extrahieren oderzip
Dateien. Standardmäßig kopiert es die Archivdatei vor dem Extrahieren vom Kontrollknoten auf die Zielmaschine. Ändern Sie dieses Verhalten, indem Sie den Parameterremote_src: yes
bereitstellen .Extrahieren Sie beispielsweise den Inhalt einer
.tar.gz
Datei, die bereits mit dieser Syntax auf den Zielhost heruntergeladen wurde:- name:Inhalt von app.tar.gz extrahieren
unarchive:
src:/tmp/app.tar.gz
dest:/app
remote_src:yesEinige Archivierungstechnologien erfordern zusätzliche Pakete, die auf dem Zielsystem verfügbar sind; zum Beispiel das Paket
unzip
um.zip
zu extrahieren Dateien.Abhängig vom verwendeten Archivformat kann dieses Modul idempotent funktionieren oder nicht. Um unnötige Änderungen zu vermeiden, können Sie den Parameter
creates
verwenden um eine Datei oder ein Verzeichnis anzugeben, das dieses Modul beim Extrahieren des Archivinhalts erstellen würde. Wenn diese Datei oder dieses Verzeichnis bereits existiert, extrahiert das Modul den Inhalt nicht erneut.10. Befehl
Das Befehlsmodul ist ein flexibles Modul, mit dem Sie beliebige Befehle auf dem Zielsystem ausführen können. Mit diesem Modul können Sie fast alles auf dem Zielsystem machen, solange es einen Befehl dafür gibt.
Obwohl der
command
Modul flexibel und leistungsfähig ist, sollte es mit Vorsicht verwendet werden. Vermeiden Sie die Verwendung des Befehlsmoduls zum Ausführen einer Aufgabe, wenn dafür ein anderes geeignetes Modul verfügbar ist. Zum Beispiel könnten Sie Erstellen Sie Benutzer mit demcommand
Modul zum Ausführen vonuseradd
Befehl, aber Sie sollten Verwenden Sie denuser
Modul, da es viele Details von Ihnen abstrahiert, sich um Sonderfälle kümmert und sicherstellt, dass sich die Konfiguration nur bei Bedarf ändert.Für Fälle, in denen keine Module verfügbar sind, oder um benutzerdefinierte Skripte oder Programme auszuführen, verwenden Sie den
command
Modul ist immer noch eine großartige Ressource. Verwenden Sie beispielsweise dieses Modul, um ein Skript auszuführen, das bereits auf dem Zielcomputer vorhanden ist:- name:Führen Sie den App-Installer
-Befehl aus:"/app/install.sh"Standardmäßig ist dieses Modul nicht idempotent, da Ansible den Befehl jedes Mal ausführt. Um den
command
zu machen Modul idempotent, Sie könnenwhen
verwenden Bedingungen, um den Befehl nur auszuführen, wenn die entsprechende Bedingung vorhanden ist, oder dercreates
-Argument, ähnlich wie im Beispiel des Unarchive-Moduls.Was kommt als nächstes?
Mit diesen Modulen können Sie ganze Linux-Systeme konfigurieren, indem Sie Konfigurationsdateien kopieren, erstellen oder ändern, Benutzer erstellen, Pakete installieren, Systemdienste starten, die Firewall aktualisieren und vieles mehr.
Wenn Sie neu bei Ansible sind, lesen Sie unbedingt die Dokumentation zum Erstellen von Playbooks, um diese Module zu kombinieren und Ihr System zu automatisieren. Einige dieser Aufgaben müssen mit erhöhten Rechten ausgeführt werden, damit sie funktionieren. Weitere Einzelheiten finden Sie in der Dokumentation zur Berechtigungsausweitung.
Ab Ansible 2.10 sind Module in Sammlungen organisiert. Die meisten Module in dieser Liste sind Teil der
ansible.builtin
Sammlung und sind standardmäßig mit Ansible verfügbar, aber einige von ihnen sind Teil anderer Sammlungen. Eine Liste der Sammlungen finden Sie in der Ansible-Dokumentation.