Erstellen von Vorlagen in Ansible zum Erstellen von Konfigurationen auf verwalteten Knoten – Teil 7
Was ist Templating in Ansible?
Um ein besseres Gefühl dafür zu bekommen, was eine Vorlage ist, betrachten wir einen IT-Manager, der eine E-Mail erstellt, um seine Abteilung zu einer Cocktailparty einzuladen. Die E-Mail wird an jedes Mitglied gesendet und lädt sie außerdem ein, sich mit ihren Ehepartnern zusammenzutun.
Die E-Mail wurde so angepasst, dass der Text der E-Mail gleich bleibt, die Adressaten und die Namen ihrer jeweiligen Ehepartner jedoch variieren. Die E-Mail wird zum Vorlage, während die Empfänger und jeweiligen Ehepartner sind Variablen.
Das war ein allgemeines Beispiel. Ansible verwendet Jinja2 Dies ist eine moderne Vorlagen-Engine für Python-Frameworks, mit der dynamische Inhalte oder Ausdrücke generiert werden. Vorlagen sind äußerst nützlich, wenn Sie benutzerdefinierte Konfigurationsdateien für mehrere Server erstellen, die jedoch für jeden Server eindeutig sind.
Jinja2 verwendet die doppelten geschweiften Klammern {{ ... }}
um eine definierte Variable einzuschließen. Verwenden Sie für Kommentare {{# #}
und für bedingte Anweisungen verwenden {% … %}
.
Nehmen wir an, Sie haben ein Datenmodell von VLANs in Ihrem Netzwerk mit Host-Systemen, die Sie auf ihre jeweiligen pushen möchten VLANs wie gezeigt.
vlans: - id: 10 name: LB - id: 20 name: WB_01 - id: 30 name: WB_02 - id: 40 name: DB
Um diese Konfiguration zu rendern, muss die entsprechende jinja2 Vorlage aufgerufen vlans.j2 würde wie gezeigt erscheinen. Wie Sie sehen können, die Variablen vlan.id und vlan.name wurden in geschweiften Klammern eingeschlossen.
vlan {{ vlan.id }} name {{ vlan.name }}
Wenn Sie alles in einem Playbook zusammenfassen, in dem verschiedene Host-Computer platziert sind, sieht dies folgendermaßen aus:
- 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 werden wir erstellen index.html Dateien, die Informationen über die anzeigen Hostname & das Betriebssystem von 2 Webservern läuft CentOS & Ubuntu.
Konfiguration
Ubuntu 18 - IP address: 173.82.202.239 CentOS 7 - IP address: 173.82.115.165
Auf beiden Servern wurde bereits ein Apache-Webserver installiert.
Für CentOS 7
Für Ubuntu 18.04
Erstellen wir also ein Spielbuch 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 das wird auf die geschoben index.html Datei auf jedem Webserver. Denken Sie immer daran, die Erweiterung zu setzen .j2
am Ende, um anzuzeigen, dass es sich um eine jinja2-Datei handelt.
Lassen Sie uns nun die Vorlagendatei erstellen index.html.j2.
The hostname of this webserver is {{ ansible_hostname }}
It is running on {{ ansible_os_family}}system
Diese Vorlage ist eine grundlegende HTML-Datei, in der die ansible_hostname und ansible_os_family sind eingebaute Variablen, 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 beide neu CentOS 7 und Ubuntu Webserver.
Für CentOS 7
Für Ubuntu 18.04
Wie Sie sehen können, wurden auf jedem Server unterschiedliche Informationen zum Hostnamen und zur Betriebssystemfamilie angezeigt. Und so cool Jinja2 Vorlage ist!
FILTER:
Manchmal können Sie den Wert einer Variablen durch eine Zeichenfolge ersetzen, die auf eine bestimmte Weise angezeigt wird.
Beispiel 1: Zeichenfolgen in Groß- / Kleinbuchstaben anzeigen
Im vorherigen Beispiel können wir beispielsweise festlegen, dass die Ansible-Variablen in Großbuchstaben angezeigt werden. Fügen Sie dazu den oberen Wert an die Variable an. Auf diese Weise wird der Wert in der Variablen in Großbuchstaben konvertiert.
{{ ansible_hostname | upper }} => CENTOS 7 {{ ansible_os_family | upper }} => REDHAT
Ebenso können Sie die Zeichenfolgenausgabe in Kleinbuchstaben konvertieren, 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.
Beispielsweise:
Der Filmtitel ist {{ movie_name }} =>
Der Filmtitel ist Ring.
Verwenden Sie das Argument replace wie folgt, um die Ausgabe durch eine andere Zeichenfolge zu ersetzen:
Der Filmtitel ist {{ movie_name | replace (“Ring“,”Heist”) }} =>
Der Filmtitel ist Raub.
Beispiel 3: Listet Filter auf und legt sie fest
Verwenden Sie die Taste, um den kleinsten Wert in einem Array abzurufen Mindest Filter.
{{ [ 2, 3, 4, 5, 6, 7 ] | min }} => 2
Verwenden Sie zum Abrufen der größten Anzahl die Taste max Filter.
{{ [ 2, 3, 4, 5, 6, 7 ] | max }} => 7
Verwenden Sie die Taste, um eindeutige Werte anzuzeigen einzigartig Filter.
{{ [ 2, 3, 3, 2, 6, 7 ] | unique }} => 2, 3
Verwenden Sie die zufällig filtern, um eine Zufallszahl zwischen 0 und dem Wert zu erhalten.
{{ 50 | random }} => Some random number
LOOPS:
Genau wie in Programmiersprachen haben wir Schleifen in Ansible Jinja2.
Um beispielsweise eine Datei mit einer Liste von Zahlen zu generieren, verwenden Sie die für 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 kombinieren ansonsten Anweisungen zum Filtern und Abrufen bestimmter Werte.
Beispiel 2:
{% for number in [0, 1, 2, 3, 4, 5, 6, 7] %} {% if number == 5 %} {{ number }} {% endif%} {% endfor %}
Und das wars für diesen Vortrag. Begleiten Sie uns beim nächsten Thema, wo wir uns an die Arbeit mit ansiblen Variablen und Fakten wagen werden.