Dans cette étape, vous allez résoudre les erreurs liées à Jinja2, le puissant moteur de templating d'Ansible. Vous apprendrez pourquoi les expressions Jinja2 doivent souvent être mises entre guillemets et comment déboguer les problèmes lorsque le playbook ne trouve pas un fichier de modèle spécifié. Ce sont des erreurs d'exécution courantes qui surviennent après qu'un playbook a déjà passé une vérification de syntaxe.
-
Création d'un fichier de modèle Jinja2
Tout d'abord, vous avez besoin d'un fichier de modèle. Contrairement à un fichier statique, un modèle peut contenir des variables qu'Ansible remplacera par des valeurs réelles lors de l'exécution du playbook. Vous allez créer un modèle HTML simple.
Utilisez nano pour créer un fichier nommé index.html.j2 dans votre répertoire de projet (~/project/ansible_troubleshooting). L'extension .j2 est une convention courante pour les modèles Jinja2.
nano index.html.j2
Copiez et collez le contenu HTML suivant dans l'éditeur. Notez le placeholder {{ welcome_message }}, qui est une variable Jinja2.
<h1>{{ welcome_message }}</h1>
<p>This page was deployed by Ansible.</p>
Enregistrez le fichier et quittez nano (Ctrl+X, Y, Entrée).
-
Modification du Playbook pour utiliser le modèle et introduire des erreurs
Maintenant, modifiez votre playbook webserver.yml pour utiliser le module ansible.builtin.template. Vous introduirez également deux nouvelles erreurs : une variable Jinja2 non citée et un chemin de modèle incorrect.
Ouvrez webserver.yml avec nano :
nano webserver.yml
Remplacez tout le contenu du fichier par ce qui suit. La directive become: true indique à Ansible d'exécuter les tâches avec des privilèges administratifs (en utilisant sudo), ce qui est nécessaire pour installer des logiciels et écrire des fichiers dans des répertoires système comme /var/www/html.
---
- 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
Enregistrez et quittez l'éditeur.
-
Identification et correction de l'erreur de guillemets Jinja2
Même s'il s'agit d'un problème Jinja2, il peut se manifester par une erreur de syntaxe YAML. Exécutez le vérificateur de syntaxe pour voir comment Ansible l'interprète.
ansible-playbook --syntax-check webserver.yml
Sortie attendue (Erreur) : Vous obtiendrez une erreur de syntaxe car une valeur YAML commençant par {{ est traitée comme une construction spéciale et doit être mise entre guillemets pour être interprétée comme une chaîne.
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
Solution : Ouvrez webserver.yml et entourez la variable Jinja2 de guillemets doubles.
nano webserver.yml
Modifiez la tâche Install httpd package :
## ... (reste du fichier)
tasks:
- name: Install httpd package
ansible.builtin.dnf:
## FIX: Quote the Jinja2 expression
name: "{{ package_name }}"
state: present
## ... (reste du fichier)
Enregistrez et quittez. La vérification de syntaxe devrait maintenant réussir.
-
Identification et correction de l'erreur de chemin de modèle
Maintenant que la syntaxe est correcte, essayez d'exécuter le playbook.
ansible-playbook webserver.yml
Sortie attendue (Erreur) : Le playbook échouera, mais cette fois, il s'agit d'une erreur d'exécution, pas d'une erreur de syntaxe. Le message d'erreur indique clairement que le fichier source index.j2 n'a pas pu être trouvé.
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."}
Cela se produit car le paramètre src de votre playbook pointe vers index.j2, mais le fichier que vous avez créé s'appelle index.html.j2.
Solution : Ouvrez webserver.yml une dernière fois et corrigez le nom du fichier.
nano webserver.yml
Modifiez le paramètre src dans la tâche Create a test index page from template :
## ... (reste du fichier)
- 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
## ... (reste du fichier)
Enregistrez et quittez l'éditeur.
-
Exécution réussie du Playbook
Exécutez à nouveau le playbook. Il devrait maintenant terminer toutes les tâches avec succès.
ansible-playbook webserver.yml
Sortie attendue (Succès) :
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