Variablen und Templates

AnsibleBeginner
Jetzt üben

Einführung

Wenn Sie 100 Server verwalten, sollen diese nicht unbedingt exakt gleich sein. Jeder Server benötigt möglicherweise einen eigenen Hostnamen, eine eigene IP-Adresse oder bestimmte Konfigurationseinstellungen.

Ansible löst dieses Problem mit Variablen und Templates.

  • Variablen: Platzhalter für Daten, zum Beispiel port: 8080 oder server_name: "web-01".
  • Templates: Textdateien mit „Lücken“. Ansible füllt diese Lücken mit Variablen und erstellt daraus die fertige Datei.

Durch diese Kombination wird Automatisierung wiederverwendbar statt repetitiv. Sie können eine allgemeine Struktur für viele Hosts verwenden und gleichzeitig die Daten ändern, die für die jeweilige Umgebung oder Maschine eingesetzt werden.

Ansible verwendet die Template-Sprache Jinja2. Dadurch wird die Automatisierung wiederverwendbarer: Ein Template kann abhängig von den bereitgestellten Variablen unterschiedliche fertige Konfigurationsdateien erzeugen.

Das Ergebnis sieht dann so aus: Welcome to web-01

In diesem Lab erstellen Sie mithilfe von Variablen und Templates eine individuelle HTML-Webseite für Ihren Server.

Template erstellen

Zuerst organisieren wir unsere Dateien. Ansible sucht Templates in einem bestimmten Ordner mit dem Namen templates.

Diese Konvention gehört zum Design von Ansible. Ansible bevorzugt vorhersehbare Verzeichnisstrukturen, damit Automatisierungen leicht lesbar sind und von mehreren Teams gemeinsam genutzt werden können.

Erstellen Sie dieses Verzeichnis innerhalb Ihres Projektordners:

mkdir -p ~/project/templates

Erstellen Sie nun die Template-Datei. Template-Dateien enden normalerweise mit .j2 (für Jinja2).

Öffnen Sie nano, um index.html.j2 zu erstellen:

nano ~/project/templates/index.html.j2

Fügen Sie den folgenden HTML-Code ein. Beachten Sie die speziellen Klammern {{ }}. Damit weisen wir Ansible an: „Setze hier eine Variable ein.“

<html>
  <head>
    <title>{{ page_title }}</title>
  </head>
  <body>
    <h1>Welcome to {{ inventory_hostname }}</h1>
    <p>This file was generated by Ansible.</p>
  </body>
</html>

Die Variablen im Überblick:

  • {{ page_title }}: Dies ist eine benutzerdefinierte Variable. Ihren Wert legen wir später in unserem Playbook fest.
  • {{ inventory_hostname }}: Dies ist eine magische Variable. Ansible kennt ihren Wert automatisch. Sie enthält den Namen des Servers, auf dem Ansible gerade arbeitet – in unserem Fall localhost.

Es ist hilfreich, diese beiden Arten von Werten zu unterscheiden. Einige Variablen definieren Sie selbst, andere stellt Ansible automatisch aus dem Inventory und dem Ausführungskontext bereit.

Speichern und schließen Sie die Datei (Ctrl+X, Y, Enter).

Variablen definieren

Jetzt benötigen wir ein Playbook, das dieses Template verwendet. Im Playbook legen wir den Wert für unsere benutzerdefinierte Variable page_title fest.

Erstellen Sie eine neue Datei mit dem Namen playbook.yml:

nano ~/project/playbook.yml

Definieren Sie zunächst den Play und die Variablen:

---
- name: Deploy Web Page
  hosts: localhost
  vars:
    page_title: "My LabEx Web Server"
  tasks:

Den Code verstehen:

  • vars:: In diesem Abschnitt listen Sie Ihre Variablen auf.
  • page_title: "...": Damit teilen wir Ansible mit, dass Ansible {{ page_title }} in einem Template durch "My LabEx Web Server" ersetzen soll.

Lassen Sie die Datei für den nächsten Schritt geöffnet.

Das Template-Modul verwenden

Jetzt fügen wir den Task hinzu, der die eigentliche Arbeit erledigt. Wir verwenden dafür das Modul template. Dieses Modul liest unsere .j2-Datei ein, setzt die Variablen ein und speichert das Ergebnis auf dem Server.

In der Praxis werden viele Konfigurationsdateien in realen Umgebungen mit dem Template-Modul bereitgestellt. Statt eine statische Datei zu kopieren, erzeugen Sie aus einem gemeinsamen Muster eine host-spezifische Version.

Fügen Sie den Task zu Ihrer playbook.yml hinzu. Achten Sie auf die Einrückung!

---
- name: Deploy Web Page
  hosts: localhost
  become: yes
  vars:
    page_title: "My LabEx Web Server"
  tasks:
    - name: Create index.html from template
      template:
        src: templates/index.html.j2
        dest: /var/www/html/index.html
        mode: "0644"

Den Code verstehen:

  • template:: Das Modul, das wir verwenden.
  • src: Die Quelldatei – unser Template mit den Platzhaltern.
  • dest: Das Ziel – der Speicherort der fertigen HTML-Datei.
  • mode: "0644": Legt die Dateiberechtigungen fest, damit der Webserver die Datei lesen kann.
  • become: yes: Diese Angabe ist erforderlich, weil zum Schreiben nach /var/www/html Root-Berechtigungen benötigt werden.

Speichern und schließen Sie die Datei.

Bereitstellen und überprüfen

Führen Sie das Playbook aus und beobachten Sie das Ergebnis.

Führen Sie das Playbook aus:

ansible-playbook -i inventory playbook.yml

Wenn der Vorgang erfolgreich war, sehen Sie den Status changed.

Sehen wir uns nun die fertige Datei an, die Ansible erstellt hat. Die Platzhalter sollten verschwunden und durch echten Text ersetzt worden sein.

Lesen Sie die erzeugte HTML-Datei:

cat /var/www/html/index.html

Erwartetes Ergebnis:

<html>
  <head>
    <title>My LabEx Web Server</title>
  </head>
  <body>
    <h1>Welcome to localhost</h1>
    <p>This file was generated by Ansible.</p>
  </body>
</html>

Wie Sie sehen, wurde {{ page_title }} zu "My LabEx Web Server" und {{ inventory_hostname }} zu "localhost".

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie Ihre Konfigurationen dynamisch gestalten.

  1. Templates: Sie haben eine .j2-Datei mit {{ placeholders }} erstellt.
  2. Variablen: Sie haben Werte im Abschnitt vars des Playbooks definiert.
  3. Magische Variablen: Sie haben inventory_hostname verwendet, das Ansible automatisch bereitstellt.
  4. Template-Modul: Sie haben das Modul template verwendet, um Variablen und Templates zu einer fertigen Konfigurationsdatei zusammenzuführen.

Mit dieser leistungsfähigen Funktion können Sie ein einzelnes Template verwenden, um Tausende von Servern zu konfigurieren, wobei jeder Server seine eigenen spezifischen Details erhält.