Website-Suche

So erstellen Sie Vorlagen in Ansible, um Konfigurationen auf verwalteten Knoten zu erstellen – Teil 7


In diesem Teil 7 der Ansible-Reihe erfahren Sie, wie Sie Vorlagen in Ansible erstellen und verwenden, um benutzerdefinierte Konfigurationen auf verwalteten Knoten zu erstellen. Die Erstellung von Vorlagen in Ansible ist eine einfache und benutzerfreundliche Möglichkeit, benutzerdefinierte Konfigurationen mit minimaler Bearbeitung von Playbook-Dateien auf verwaltete Knoten zu übertragen, auf denen verschiedene Systeme ausgeführt werden.

Was ist Templating in Ansible?

Um eine bessere Vorstellung davon zu bekommen, was eine Vorlage ist, stellen wir uns einen IT-Manager vor, der eine E-Mail verfasst, um seine Abteilung zu einer Cocktailparty einzuladen. Die E-Mail wird an alle Mitglieder gesendet und lädt sie außerdem ein, sich mit ihren Ehepartnern zu treffen.

Die E-Mail wurde so angepasst, dass der Text der E-Mail gleich bleibt, die Adressaten und die Namen der jeweiligen Ehepartner jedoch variieren. Die E-Mail wird zur Vorlage, während die Empfänger und jeweiligen Ehepartner Variablen sind.

Das war ein allgemeines Beispiel. Ansible verwendet Jinja2, eine moderne Template-Engine für Python-Frameworks, die zum Generieren dynamischer Inhalte oder Ausdrücke verwendet wird. Vorlagen sind äußerst nützlich, wenn Sie benutzerdefinierte Konfigurationsdateien für mehrere Server erstellen, die jedoch für jeden Server einzigartig sind.

Jinja2 verwendet die doppelten geschweiften Klammern {{ ... }}, um eine definierte Variable einzuschließen. Für Kommentare verwenden Sie {{# #} und für bedingte Anweisungen {% … %}.

Nehmen wir an, dass Sie in Ihrem Netzwerk über ein Datenmodell von VLANs mit Hostsystemen verfügen, die Sie wie gezeigt auf ihre jeweiligen VLANs übertragen möchten.

vlans:
  - id: 10
    name: LB
  - id: 20
    name: WB_01
  - id: 30
    name: WB_02
  - id: 40
    name: DB

Um diese Konfiguration darzustellen, würde die entsprechende jinja2-Vorlage mit dem Namen vlans.j2 wie gezeigt erscheinen. Wie Sie sehen können, wurden die Variablen vlan.id und vlan.name in geschweifte Klammern eingeschlossen.

vlan {{ vlan.id }}
  name {{ vlan.name }}

Wenn man alles in einem Playbook zusammenfasst, das verschiedene Host-Maschinen platziert, würde dies wie folgt aussehen:

    - hosts
  tasks:
    - name: Rendering VLAN configuration
      template:
         src: vlans.j2
         dest: "vlan_configs/{{ inventory_hostname }}.conf"

Beispiel 1: Konfigurieren von Webservern in verschiedenen Distributionen

In diesem Beispiel erstellen wir index.html-Dateien, die Informationen über den Hostnamen und das Betriebssystem von zwei Webservern anzeigen, auf denen CentOS und Ubuntu ausgeführt werden .

Aufstellen

Ubuntu 18 - IP address: 173.82.202.239
CentOS 7 -  IP address: 173.82.115.165

Auf beiden Servern ist bereits der Apache-Webserver installiert.

Für CentOS 7

Für Ubuntu 18.04

Erstellen wir also ein Playbook test_server.yml wie gezeigt:

---

 - hosts: all
   become: yes

   tasks:

    - name: Install index.html
      template:
        src: index.html.j2
        dest: /var/www/html/index.html
        mode: 0777

Unsere Jinja-Dateivorlage ist index.html.j2, die in die Datei index.html auf jedem Webserver übertragen wird. Denken Sie immer daran, die Erweiterung .j2 am Ende einzufügen, um anzuzeigen, dass es sich um eine Jinja2-Datei handelt.

Erstellen wir nun die Vorlagendatei index.html.j2.

<html>
<center>
   <h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
   <h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>

Bei dieser Vorlage handelt es sich um eine einfache HTML-Datei, in der ansible_hostname und ansible_os_family integrierte Variablen sind, die durch die jeweiligen Hostnamen und Betriebssysteme der einzelnen Webserver im Browser ersetzt werden.

Lassen Sie uns nun das Playbook ausführen.

ansible-playbook test_server.yml

Laden wir nun die Webseiten für die Webserver CentOS 7 und Ubuntu neu.

Für CentOS 7

Für Ubuntu 18.04

Wie Sie sehen, wurden auf jedem Server unterschiedliche Informationen zum Hostnamen und zur Betriebssystemfamilie angezeigt. Und so cool ist das Jinja2-Template!

FILTER:

Manchmal entscheiden Sie sich möglicherweise dafür, den Wert einer Variablen durch eine Zeichenfolge zu ersetzen, die auf eine bestimmte Weise angezeigt wird.

Beispiel 1: Zeichenfolgen in Groß-/Kleinbuchstaben anzeigen lassen

Im vorherigen Beispiel können wir beispielsweise entscheiden, dass die Ansible-Variablen in Großbuchstaben angezeigt werden. Hängen Sie dazu den oberen Wert an die Variable an. Auf diese Weise wird der Wert in der Variablen in das Großbuchstabenformat konvertiert.

{{ ansible_hostname | upper }} => CENTOS 7
{{ ansible_os_family | upper }} => REDHAT

Ebenso können Sie die Zeichenfolgenausgabe in Kleinbuchstaben umwandeln, indem Sie das untere Argument anhängen.

{{ ansible_hostname | lower }}  => centos 7
{{ ansible_os_family | lower }} => redhat

Beispiel 2: Ersetzen Sie einen String durch einen anderen

Darüber hinaus können Sie eine Zeichenfolge durch eine andere ersetzen.

Zum Beispiel:

Der Filmtitel ist {{ movie_name }} => Der Filmtitel ist Ring.

Um die Ausgabe durch eine andere Zeichenfolge zu ersetzen, verwenden Sie das Ersetzungsargument wie gezeigt:

Der Filmtitel ist {{ movie_name | replace („Ring“, „Heist“) }} => Der Filmtitel lautet Heist.

Beispiel 3: Filter auflisten und festlegen

Um den kleinsten Wert in einem Array abzurufen, verwenden Sie den Filter min.

{{ [ 2, 3, 4, 5, 6, 7 ] | min }}	=>	2

Um die größte Zahl abzurufen, verwenden Sie auf ähnliche Weise den max-Filter.

{{ [ 2, 3, 4, 5, 6, 7 ] | max }}	=>	7

Um eindeutige Werte anzuzeigen, verwenden Sie den Filter einzigartig.

{{ [ 2, 3, 3, 2, 6, 7 ] | unique }} =>	2, 3

Verwenden Sie den Zufalls-Filter, um eine Zufallszahl zwischen 0 und dem Wert zu erhalten.

{{ 50 | random }} =>  Some random number

SCHLEIFEN:

Genau wie in Programmiersprachen gibt es in Ansible Jinja2 Schleifen.

Um beispielsweise eine Datei mit einer Liste von Zahlen zu generieren, verwenden Sie die for-Schleife, wie im folgenden Beispiel gezeigt:

Beispiel 1:

{% for number in [0, 1, 2, 3, 4, 5, 6, 7]  %}
{{ number }}
{% end for %}

Sie können die for-Schleife auch mit if-else-Anweisungen kombinieren, um bestimmte Werte zu filtern und abzurufen.

Beispiel 2:

{% for number in [0, 1, 2, 3, 4, 5, 6, 7]  %}
{% if number == 5 %}
         {{ number }}
{% endif%}
{% endfor %}

Und das war’s für diesen Vortrag. Begleiten Sie uns im nächsten Thema, in dem wir uns an die Arbeit mit ansiblen Variablen und Fakten wagen.