Ansible ist eine vollständige Automatisierungslösung für Ihre IT-Umgebung. Sie können Ansible verwenden, um die Linux- und Windows-Serverkonfiguration zu automatisieren, die Dienstbereitstellung zu orchestrieren, Cloud-Umgebungen bereitzustellen und sogar Ihre Netzwerkgeräte zu 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: Ensure MOTD file is in place
copy:
src: files/motd
dest: /etc/motd
owner: root
group: root
mode: 0644
Bei weniger komplexen Inhalten können Sie den Inhalt direkt in die Zieldatei kopieren, ohne eine lokale Datei zu haben, wie hier:
- name: Ensure MOTD file is in place
copy:
content: "Welcome to this system."
dest: /etc/motd
owner: root
group: root
mode: 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 mit 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
Welcome to {{ inventory_hostname }}.
Instanziieren Sie dann diese Vorlage mit der template
Modul, so:
- name: Ensure MOTD file is in place
template:
src: templates/motd.j2
dest: /etc/motd
owner: root
group: root
mode: 0644
Vor dem Kopieren der Datei verarbeitet Ansible die Vorlage, interpoliert die Variable und ersetzt sie durch den Namen des Zielhostsystems. Wenn beispielsweise der Zielsystemname lautet rh8-vm03
, die Ergebnisdatei lautet:
Welcome to rh8-vm03.
Während copy
Modul kann auch Variablen interpolieren, wenn es verwendet wird content
Parameter, der template
Modul ermöglicht zusätzliche Flexibilität durch das Erstellen von Vorlagendateien, die es Ihnen ermöglichen, komplexere Inhalte zu definieren, einschließlich for
Schleifen, if
Bedingungen und mehr. Eine vollständige Referenz finden Sie in der Jinja2-Dokumentation.
Dieses Modul ist ebenfalls 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 zu erstellen ricardo
mit UID 2001, Teil der Gruppen users
und wheel
, und Passwort mypassword
, Wende an user
Modul mit diesen Parametern:
- name: Ensure user ricardo exists
user:
name: ricardo
group: users
groups: wheel
uid: 2001
password: "{{ 'mypassword' | password_hash('sha512') }}"
state: present
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 Läufen festlegt.
Sie können dieses Modul auch verwenden, um einen Benutzer zu löschen, indem Sie den Parameter setzen state: absent
.
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 Ihnen das Installieren, Aktualisieren oder Entfernen von Softwarepaketen auf Ihrem Zielsystem mithilfe des Standardpaketmanagers des Betriebssystems.
Um beispielsweise den Apache-Webserver auf einem Red Hat Linux-Rechner zu installieren, wenden Sie das Modul wie folgt an:
- name: Ensure Apache package is installed
package:
name: httpd
state: present
Dieses Modul ist verteilungsunabhängig und funktioniert mit dem zugrunde liegenden Paketmanager, z 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 ist apache2
. 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 zum Starten der sshd
verwenden Sie das Modul wie folgt:
- name: Ensure SSHD is started
service:
name: sshd
state: started
Sie können auch sicherstellen, dass der Dienst automatisch gestartet wird, wenn das Zielsystem hochfährt, indem Sie den Parameter angeben enabled: yes
.
Wie bei der package
Modul, das 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, ist die service
Modul ist auch idempotent.
6. Firewalld
Verwenden Sie das Modul firewalld, um die System-Firewall mit dem zu steuern firewalld
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: Ensure port 80 (http) is open
firewalld:
service: http
state: enabled
permanent: yes
immediate: yes
Sie können auch benutzerdefinierte Ports anstelle von Dienstnamen mit angeben port
Parameter. Geben Sie in diesem Fall auch das Protokoll an. Um beispielsweise den TCP-Port 3000 zu öffnen, verwenden Sie Folgendes:
- name: Ensure port 3000/TCP is open
firewalld:
port: 3000/tcp
state: enabled
permanent: yes
immediate: yes
Sie können dieses Modul auch verwenden, um andere zu steuern firewalld
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
Eigentum des Benutzers ricardo
, mit Lese-, Schreib- und Ausführungsberechtigungen für den Eigentümer und die Gruppe users
:
- name: Ensure directory /app exists
file:
path: /app
state: directory
owner: ricardo
group: users
mode: 0770
Sie können dieses Modul auch verwenden, um Dateieigenschaften für Verzeichnisse rekursiv festzulegen, indem Sie den Parameter verwenden recurse: yes
oder löschen Sie Dateien und Verzeichnisse mit dem Parameter state: 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. Zeilendatei
Mit dem lineinfile-Modul können Sie einzelne Zeilen in bestehenden Dateien verwalten. Es ist nützlich, die Zielkonfiguration für vorhandene 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: Ensure host rh8-vm03 in hosts file
lineinfile:
path: /etc/hosts
line: 192.168.122.236 rh8-vm03
state: present
Sie können dieses Modul auch verwenden, um eine bestehende Zeile zu ändern, indem Sie den Parameter anwenden regexp
um nach einer bestehenden Leitung zu suchen, die ersetzt werden soll. Aktualisieren Sie beispielsweise die sshd_config
Datei, um die Root-Anmeldung durch Ändern der Zeile zu verhindern PermitRootLogin yes
zu PermitRootLogin no
:
- name: Ensure root cannot login via ssh
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^PermitRootLogin'
line: PermitRootLogin no
state: present
Hinweis: 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 z tar
oder zip
Dateien. Standardmäßig kopiert es die Archivdatei vor dem Extrahieren vom Kontrollknoten auf die Zielmaschine. Ändern Sie dieses Verhalten, indem Sie den Parameter angeben remote_src: yes
.
Extrahieren Sie beispielsweise den Inhalt von a .tar.gz
Datei, die bereits mit dieser Syntax auf den Zielhost heruntergeladen wurde:
- name: Extract contents of app.tar.gz
unarchive:
src: /tmp/app.tar.gz
dest: /app
remote_src: yes
Einige Archivierungstechnologien erfordern zusätzliche Pakete, die auf dem Zielsystem verfügbar sind; zum Beispiel das Paket unzip
extrahieren .zip
Dateien.
Abhängig vom verwendeten Archivformat kann dieses Modul idempotent funktionieren oder nicht. Um unnötige Änderungen zu vermeiden, können Sie den Parameter verwenden creates
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 tun, solange es einen Befehl dafür gibt.
Obwohl die 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 Sie könnten Erstellen Sie Benutzer mithilfe von command
Modul zum Ausführen der useradd
Befehl, aber Sie sollen benutze die user
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, kann die 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: Run the app installer
command: "/app/install.sh"
Standardmäßig ist dieses Modul nicht idempotent, da Ansible den Befehl jedes Mal ausführt. Das zu machen command
Modul idempotent, können Sie verwenden when
Bedingungen, um den Befehl nur auszuführen, wenn die entsprechende Bedingung vorliegt, oder die creates
-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 Rechteausweitung.
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.