En este paso, abordará errores relacionados con Jinja2, el potente motor de plantillas de Ansible. Aprenderá por qué las expresiones Jinja2 a menudo necesitan ser entrecomilladas y cómo depurar problemas cuando un playbook no puede encontrar un archivo de plantilla especificado. Estos son errores comunes en tiempo de ejecución que ocurren después de que un playbook ya ha pasado una verificación de sintaxis.
-
Crear un Archivo de Plantilla Jinja2
Primero, necesita un archivo de plantilla. A diferencia de un archivo estático, una plantilla puede contener variables que Ansible reemplazará con valores reales durante la ejecución del playbook. Creará una plantilla HTML simple.
Use nano para crear un archivo llamado index.html.j2 en su directorio de proyecto (~/project/ansible_troubleshooting). La extensión .j2 es una convención común para las plantillas Jinja2.
nano index.html.j2
Copie y pegue el siguiente contenido HTML en el editor. Observe el marcador de posición {{ welcome_message }}, que es una variable Jinja2.
<h1>{{ welcome_message }}</h1>
<p>This page was deployed by Ansible.</p>
Guarde el archivo y salga de nano (Ctrl+X, Y, Enter).
-
Modificar el Playbook para Usar la Plantilla e Introducir Errores
Ahora, modifique su playbook webserver.yml para usar el módulo ansible.builtin.template. También introducirá dos nuevos errores: una variable Jinja2 sin comillas y una ruta de plantilla incorrecta.
Abra webserver.yml con nano:
nano webserver.yml
Reemplace todo el contenido del archivo con lo siguiente. La directiva become: true le dice a Ansible que ejecute tareas con privilegios administrativos (usando sudo), lo cual es necesario para instalar software y escribir archivos en directorios del sistema como /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
Guarde y salga del editor.
-
Identificar y Corregir el Error de Comillas Jinja2
Aunque este es un problema de Jinja2, puede manifestarse como un error de sintaxis YAML. Ejecute el verificador de sintaxis para ver cómo lo interpreta Ansible.
ansible-playbook --syntax-check webserver.yml
Salida Esperada (Error): Obtendrá un error de sintaxis porque un valor YAML que comienza con {{ se trata como una construcción especial y debe entrecomillarse para ser interpretado como una cadena.
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
Solución: Abra webserver.yml y encierre la variable Jinja2 entre comillas dobles.
nano webserver.yml
Modifique la tarea Install httpd package:
## ... (resto del archivo)
tasks:
- name: Install httpd package
ansible.builtin.dnf:
## FIX: Quote the Jinja2 expression
name: "{{ package_name }}"
state: present
## ... (resto del archivo)
Guarde y salga. La verificación de sintaxis ahora debería pasar.
-
Identificar y Corregir el Error de Ruta de Plantilla
Ahora que la sintaxis es correcta, intente ejecutar el playbook.
ansible-playbook webserver.yml
Salida Esperada (Error): El playbook fallará, pero esta vez es un error en tiempo de ejecución, no un error de sintaxis. El mensaje de error indica claramente que no se pudo encontrar el archivo de origen index.j2.
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."}
Esto sucede porque el parámetro src en su playbook apunta a index.j2, pero el archivo que creó se llama index.html.j2.
Solución: Abra webserver.yml una última vez y corrija el nombre del archivo.
nano webserver.yml
Modifique el parámetro src en la tarea Create a test index page from template:
## ... (resto del archivo)
- 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
## ... (resto del archivo)
Guarde y salga del editor.
-
Ejecutar el Playbook Exitosamente
Ejecute el playbook nuevamente. Ahora debería completar todas las tareas con éxito.
ansible-playbook webserver.yml
Salida Esperada (Éxito):
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