In diesem Schritt befassen Sie sich mit Fehlern im Zusammenhang mit Jinja2, dem leistungsstarken Template-Engine von Ansible. Sie lernen, warum Jinja2-Ausdrücke oft in Anführungszeichen gesetzt werden müssen und wie Sie Probleme beheben, wenn ein Playbook eine angegebene Template-Datei nicht finden kann. Dies sind häufige Laufzeitfehler, die auftreten, nachdem ein Playbook eine Syntaxprüfung bestanden hat.
-
Erstellen einer Jinja2-Template-Datei
Zuerst benötigen Sie eine Template-Datei. Im Gegensatz zu einer statischen Datei kann ein Template Variablen enthalten, die Ansible während der Ausführung des Playbooks durch tatsächliche Werte ersetzt. Sie erstellen ein einfaches HTML-Template.
Verwenden Sie nano
, um eine Datei namens index.html.j2
in Ihrem Projektverzeichnis (~/project/ansible_troubleshooting
) zu erstellen. Die Erweiterung .j2
ist eine gängige Konvention für Jinja2-Templates.
nano index.html.j2
Kopieren Sie den folgenden HTML-Inhalt und fügen Sie ihn in den Editor ein. Beachten Sie den Platzhalter {{ welcome_message }}
, der eine Jinja2-Variable ist.
<h1>{{ welcome_message }}</h1>
<p>This page was deployed by Ansible.</p>
Speichern Sie die Datei und beenden Sie nano
(Ctrl+X
, Y
, Enter
).
-
Anpassen des Playbooks zur Verwendung des Templates und Einführen von Fehlern
Ändern Sie nun Ihr webserver.yml
-Playbook, um das Modul ansible.builtin.template
zu verwenden. Sie werden auch zwei neue Fehler einführen: eine Jinja2-Variable ohne Anführungszeichen und einen falschen Template-Pfad.
Öffnen Sie webserver.yml
mit nano
:
nano webserver.yml
Ersetzen Sie den gesamten Inhalt der Datei durch Folgendes. Die Direktive become: true
weist Ansible an, Aufgaben mit Administratorrechten (mittels sudo
) auszuführen, was für die Installation von Software und das Schreiben von Dateien in Systemverzeichnisse wie /var/www/html
erforderlich ist.
---
- name: Configure Web Server
hosts: localhost
become: true
vars:
package_name: httpd
welcome_message: "Welcome to Ansible with Jinja2"
tasks:
- name: Install httpd package
ansible.builtin.dnf:
## ERROR 1: Unquoted Jinja2 variable
name: { { package_name } }
state: present
- name: Create a test index page from template
ansible.builtin.template:
## ERROR 2: Incorrect template source path
src: index.j2
dest: /var/www/html/index.html
Speichern und beenden Sie den Editor.
-
Identifizieren und Beheben des Jinja2-Anführungszeichen-Fehlers
Obwohl dies ein Jinja2-Problem ist, kann es sich als YAML-Syntaxfehler manifestieren. Führen Sie die Syntaxprüfung durch, um zu sehen, wie Ansible dies interpretiert.
ansible-playbook --syntax-check webserver.yml
Erwartete Ausgabe (Fehler): Sie erhalten einen Syntaxfehler, da ein YAML-Wert, der mit {{
beginnt, als spezielles Konstrukt behandelt wird und in Anführungszeichen gesetzt werden muss, um als Zeichenkette interpretiert zu werden.
ERROR! A malformed block was encountered.
The error appears to be in '/home/labex/project/ansible_troubleshooting/webserver.yml': line 11, column 19, but may be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
## ERROR 1: Unquoted Jinja2 variable
name: {{ package_name }}
^ here
Lösung: Öffnen Sie webserver.yml
und setzen Sie die Jinja2-Variable in doppelte Anführungszeichen.
nano webserver.yml
Ändern Sie die Aufgabe Install httpd package
:
## ... (rest of the file)
tasks:
- name: Install httpd package
ansible.builtin.dnf:
## FIX: Quote the Jinja2 expression
name: "{{ package_name }}"
state: present
## ... (rest of the file)
Speichern und beenden Sie. Die Syntaxprüfung sollte nun erfolgreich sein.
-
Identifizieren und Beheben des Template-Pfadfehlers
Nachdem die Syntax korrekt ist, versuchen Sie, das Playbook auszuführen.
ansible-playbook webserver.yml
Erwartete Ausgabe (Fehler): Das Playbook schlägt fehl, aber diesmal ist es ein Laufzeitfehler, kein Syntaxfehler. Die Fehlermeldung besagt eindeutig, dass die Quelldatei index.j2
nicht gefunden werden konnte.
TASK [Create a test index page from template] **********************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Could not find or access '/home/labex/project/ansible_troubleshooting/index.j2' on the Ansible Controller."}
Dies geschieht, weil der Parameter src
in Ihrem Playbook auf index.j2
verweist, die von Ihnen erstellte Datei jedoch index.html.j2
heißt.
Lösung: Öffnen Sie webserver.yml
ein letztes Mal und korrigieren Sie den Dateinamen.
nano webserver.yml
Ändern Sie den Parameter src
in der Aufgabe Create a test index page from template
:
## ... (rest of the file)
- name: Create a test index page from template
ansible.builtin.template:
## FIX: Correct template source filename
src: index.html.j2
dest: /var/www/html/index.html
## ... (rest of the file)
Speichern und beenden Sie den Editor.
-
Ausführen des Playbooks erfolgreich
Führen Sie das Playbook erneut aus. Es sollte nun alle Aufgaben erfolgreich abschließen.
ansible-playbook webserver.yml
Erwartete Ausgabe (Erfolg):
PLAY [Configure Web Server] ****************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Install httpd package] ***************************************************
changed: [localhost]
TASK [Create a test index page from template] **********************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0