Die Verwaltung von Konfigurationen mehrerer Server und Umgebungen ist ein großer Vorteil bei der Verwendung von Ansible. Aber was passiert, wenn sich die Konfigurationsdateien von Server zu Server unterscheiden? Anstatt eine separate Konfiguration für jeden Server oder jede Umgebung zu erstellen, sollten Sie sich mit Ansible-Vorlagen befassen.
In diesem Tutorial erfahren Sie, was Ansible-Vorlagen sind, wie sie funktionieren und wie Sie das Ansible-Vorlagenmodul verwenden können, um eine Menge Zeit zu sparen.
Voraussetzungen
In diesem Beitrag handelt es sich um ein schrittweises Tutorial. Wenn Sie mitmachen möchten, stellen Sie sicher, dass Sie einen Ansible-Controller-Host haben. In diesem Tutorial wird Ansible v2.9.18 verwendet
Was ist eine Ansible-Vorlage?
Manchmal müssen Sie Textdateien an entfernte Hosts übertragen. Diese Textdateien sind in der Regel eine Art Konfigurationsdatei. Wenn Sie beispielsweise mit einem einzelnen Server arbeiten, müssen Sie möglicherweise eine Konfigurationsdatei namens app.conf erstellen, die von einem Dienst verwendet wird.
Diese Konfigurationsdatei kann server-spezifische Informationen wie Hostname, IP-Adresse, etc. enthalten. Da Sie mit einem einzelnen Server arbeiten, könnten Sie die Datei auf dem Ansible-Controller erstellen und dann das Copy-Modul in einem Playbook verwenden, um sie auf den Server zu kopieren.
Aber was ist, wenn Sie mehrere Webserver haben, von denen jeder dieselbe Konfigurationsdatei benötigt, aber jeweils eigene spezifische Werte hat? Sie können die Konfigurationsdatei nicht einfach auf alle Maschinen kopieren; sie ist nur für einen einzelnen Server mit einem bestimmten Hostnamen, einer IP-Adresse, etc. konzipiert. Sie benötigen eine Ansible-Vorlage.
Ansible-Vorlagen ermöglichen es Ihnen, Textdateien mit Variablen anstelle von statischen Werten zu definieren und diese Variablen zur Laufzeit des Playbooks zu ersetzen.
Wie sieht eine Ansible-Vorlage aus?
Eine Ansible-Vorlage ist eine Textdatei, die mit der Jinja2-Vorlagensprache und der Dateierweiterung j2 erstellt wird. Eine Jinja2-Vorlage sieht genauso aus wie die Textdatei, die Sie auf einen Remote-Host übertragen möchten. Der einzige Unterschied besteht darin, dass die Datei anstelle von statischen Werten Variablen enthält.
Zum Beispiel benötigen Sie möglicherweise eine Konfigurationsdatei namens app.conf auf all Ihren Webservern, die Verweise auf die jeweilige IP-Adresse des Servers, den Ansible-Host und den Ansible-Benutzer enthält. Die app.conf-Datei eines einzelnen Servers könnte wie das folgende Beispiel aussehen.
Sie können diese Datei nicht auf jeden Webserver kopieren, da jeder Eintrag einzigartig ist und von der IP-Adresse des Remote-Hosts, dem Hostnamen des Ansible-Controllers und dem Ansible-Benutzer abhängt.
Anstatt diese Werte statisch festzulegen, ermöglicht Ihnen eine Ansible-Vorlage, Variablen zu definieren, die zur Laufzeit interpretiert und auf dem Remote-Host ersetzt werden.
Im Folgenden finden Sie ein Beispiel für die Vorlagendatei app.conf.j2. Sie können nun sehen, dass jeder statische Wert durch eine Variable ersetzt wurde, die mit doppelten geschweiften Klammern auf beiden Seiten gekennzeichnet ist. In diesem Fall stammen diese Variablen aus Ansible-Fakten.
Vorlagendateien haben immer die Dateierweiterung J2 und haben in der Regel den gleichen Namen wie die Datei, die sie auf dem Zielsystem erstellen sollen.
Wie werden Vorlagendateien auf Remote-Hosts erstellt?
Nachdem Sie eine Vorlage erstellt haben, müssen Sie diese Vorlagendatei auf den Remote-Host übertragen und in die tatsächliche Textdatei umwandeln, die sie darstellen soll. Dazu müssen Sie die Vorlagendatei in einem Playbook referenzieren.
Die meisten Ansible-Administratoren verwenden das Kopiermodul, um Dateien auf entfernte Hosts zu übertragen, aber wie oben erwähnt, ist dies mit Vorlagen nicht möglich.
Im Folgenden sehen Sie ein einfaches Beispiel aus einem Playbook, das die Datei app.conf in das Verzeichnis /opt auf allen Zielhosts des Playbooks kopiert.
Nehmen wir nun an, Sie haben die Konfigurationsdatei app.conf auf Ihrem Ansible-Controller „vorlagenfähig“ gemacht, indem Sie sie in eine Vorlagendatei app.conf.j2 umgewandelt haben, wie im vorherigen Abschnitt beschrieben. Sie müssen jetzt sicherstellen, dass die Datei app.conf weiterhin in das Verzeichnis /opt gelangt, jedoch mit den Variablen durch reale Werte ersetzt.
Um dem Playbook mitzuteilen, die Datei app.conf im Verzeichnis /opt zu erstellen, ersetzen Sie einfach den Verweis auf copy
durch template
, wie unten gezeigt. Wenn Sie dies tun, ruft Ansible das Vorlagenmodul auf, um sowohl die Vorlage zu übertragen als auch die Variablen durch statische Werte zu ersetzen.
Sobald die obige Aufgabe im Playbook ausgeführt wird, kopiert Ansible die Datei app.conf.j2 in das Verzeichnis /opt des Remote-Hosts, ersetzt alle Variablen darin durch statische Werte und benennt die Datei in app.conf um.
Wenn Sie das Template
src
mit einem Verzeichnispfad angeben, sucht Ansible nach Vorlagen im Verzeichnis /<ansible_installation_directory>/files/. Wenn Sie nur den Dateinamen angeben, sucht Ansible stattdessen nach der Vorlage im Verzeichnis /<ansible_installation_directory>/templates/.
Erstellen einer Konfigurationsdatei: Ein Beispiel für eine Vorlage
Lassen Sie uns nun zu einer Demo übergehen, um zu sehen, wie Sie eine Ansible-Vorlage einrichten und das Ansible-Vorlagenmodul verwenden, um dynamisch eine Konfigurationsdatei zu generieren. In diesem Beispiel erstellen Sie eine Datei namens app.conf im Verzeichnis /etc auf einem Server namens SRV1.
Die Schritte in diesem Abschnitt funktionieren für jede Art von Textdatei. Das Tutorial verwendet eine Konfigurationsdatei als ein Beispiel.
1. Melden Sie sich mit Ihrem üblichen Benutzer beim Ansible-Controller-Host per SSH an.
2. Erstellen Sie im Home-Verzeichnis einen Ordner, um die Demo-Dateien dieses Tutorials zu speichern, und wechseln Sie in das Arbeitsverzeichnis.
3. Erstellen Sie eine Vorlagendatei namens app.conf.j2 im folgenden Verzeichnis.
Sie können auch verschiedene Variablen spezifisch für das Ansible-Vorlagenmodul in Ihrer Vorlage verwenden.
4. Erstellen Sie in demselben Verzeichnis ein einfaches Playbook namens my_playbook.yml. Dieses Playbook erstellt die Datei app.conf im Verzeichnis /etc.
5. Führen Sie das Ansible-Playbook auf dem Remote-Host SRV1 aus.

6. Bestätigen Sie nun, dass die Konfigurationsdatei /etc/app.conf existiert und die erwarteten Werte hat.

Aktualisieren der Dateiberechtigungen mit dem Template-Modul
Nachdem Sie die Grundlagen der Verwendung des Template-Moduls gesehen haben, gehen wir jetzt etwas weiter. Für diese Demo erstellen Sie dieselbe app.conf Datei wie zuvor gezeigt. Diesmal setzen Sie jedoch den Dateibesitzer und die Berechtigungen für diese Datei.
Um die Berechtigungen für die von dem Template-Modul erstellte Datei zu ändern, müssen Sie drei Parameter in dem Playbook verwenden:
- Besitzer – Der Dateibesitzer
- Gruppe – Die Gruppe, der die Datei angehören soll
- Modus – Die Berechtigungen. Dieser String kann entweder als Symbole oder als oktale Zahlen ausgedrückt werden
Im symbolischen Modus steht „u“ für „Benutzer“, „g“ für „Gruppe“ und „o“ für „andere“.
Wenn Sie den Ordner ~/ansible_template_demo aus dem vorherigen Abschnitt noch haben, öffnen Sie das Playbook my_playbook.yml und ersetzen Sie den Inhalt durch den unten stehenden Code. In diesem Beispiel setzt Ansible den Besitzer und die Gruppe auf den Ansible-Benutzer mithilfe von Verbindungsvariablen. Anschließend werden die Dateiberechtigungen auf 0644
gesetzt, was folgendes bedeutet:
- Besitzer hat Lese-/Schreibzugriff
- Benutzer in der Gruppe und alle anderen haben Lesezugriff
Alle verfügbaren Parameter des Template-Moduls finden Sie in der Dokumentation des Ansible Template-Moduls.
Führen Sie das Playbook erneut wie unten gezeigt aus.
Sie können nun sehen, dass die Datei app.conf die erwarteten Dateiberechtigungen hat.

Verwenden von Schleifen zur Erstellung mehrerer Template-Dateien
Manchmal reicht eine einzelne Datei nicht aus; Sie müssen mehrere Dateien auf einem Remote-Host hinzufügen. In diesem Fall können Sie Schleifen mit dem Template-Modul verwenden. Durch die Definition einer Schleife mithilfe des Parameters loop
können Sie viele Textdateien hinzufügen, die in einem Verzeichnis gespeichert sind.
Angenommen, Sie haben den Ordner ~/ansible_template_demo aus dem vorherigen Abschnitt noch, sollten Sie bereits die Datei app.conf.j2 darin haben.
1. Erstellen Sie eine zweite Template-Datei namens app2.conf.j2 im Ordner ~/ansible_template_demo wie unten gezeigt.
2. Öffnen Sie das Buch my_playbook.yml und ersetzen Sie alle Inhalte durch das folgende YAML. Dieses Playbook verwendet die Variable {{item}}
, um jeden im Loop verarbeiteten Vorlagendatei zu repräsentieren. Der Parameter loop
definiert dann jede der Vorlagendateien, die der Loop verarbeiten soll.
3. Führen Sie das Playbook erneut aus. ansible-playbook my_playbook.yml --inventory SRV1

Schlussfolgerung
Ansible-Vorlagen und das Vorlagenmodul können Ihnen viel Zeit sparen und dynamische Textdateien auf all Ihren Remote-Hosts erstellen. Das Kopiermodul bietet eine ähnliche Funktionalität, aber wenn Sie jemals dynamische Textdateien erstellen müssen, ist das Vorlagenmodul Ihr Freund.