Variables y plantillas

AnsibleBeginner
Practicar Ahora

Introducción

Si administra 100 servidores, no querrá que sean exactamente idénticos. Cada servidor puede necesitar su propio nombre de host, dirección IP o configuración específica.

Ansible resuelve esta necesidad mediante variables y plantillas.

  • Variables: marcadores de posición para datos, como port: 8080 o server_name: "web-01".
  • Plantillas: archivos de texto que contienen «espacios» que Ansible debe completar. Ansible rellena esos espacios con variables para crear el archivo final.

Esta combinación permite reutilizar la automatización en lugar de repetirla. Puede mantener una estructura general para muchos hosts y cambiar los datos que se insertan en cada entorno o máquina.

Ansible utiliza un lenguaje de plantillas llamado Jinja2. Esto hace que la automatización sea más reutilizable, porque una sola plantilla puede producir distintos archivos de configuración finales según las variables proporcionadas.

Y convertirlo en: Welcome to web-01

En este laboratorio, generará una página web HTML personalizada para su servidor mediante variables y plantillas.

Crear una plantilla

Primero, debemos organizar los archivos. Ansible busca las plantillas en una carpeta específica llamada templates.

Esta convención forma parte de la filosofía de diseño de Ansible. Ansible prefiere estructuras de directorios predecibles para que la automatización sea fácil de leer y compartir entre equipos.

Cree este directorio dentro de la carpeta del proyecto:

mkdir -p ~/project/templates

Ahora, cree el archivo de plantilla. Los archivos de plantilla suelen terminar en .j2 (por Jinja2).

Abra nano para crear index.html.j2:

nano ~/project/templates/index.html.j2

Añada el siguiente código HTML. Observe los corchetes especiales {{ }}. Así indicamos a Ansible «inserte aquí una variable».

<html>
  <head>
    <title>{{ page_title }}</title>
  </head>
  <body>
    <h1>Welcome to {{ inventory_hostname }}</h1>
    <p>This file was generated by Ansible.</p>
  </body>
</html>

Comprender las variables:

  • {{ page_title }}: es una variable personalizada. Definiremos su valor más adelante en el playbook.
  • {{ inventory_hostname }}: es una variable mágica. Ansible la conoce automáticamente: es el nombre del servidor en el que está trabajando actualmente, que en este caso es localhost.

Es útil distinguir estos dos tipos de valores. Algunas variables las define usted, mientras que otras las proporciona Ansible automáticamente a partir del inventario y del contexto de ejecución.

Guarde el archivo y salga (Ctrl+X, Y, Enter).

Definir variables

Ahora necesitamos un playbook que utilice esta plantilla. En el playbook, definiremos el valor de nuestra variable personalizada page_title.

Cree un archivo nuevo llamado playbook.yml:

nano ~/project/playbook.yml

Comience definiendo el play y las variables:

---
- name: Deploy Web Page
  hosts: localhost
  vars:
    page_title: "My LabEx Web Server"
  tasks:

Comprender el código:

  • vars:: esta sección es donde se enumeran las variables.
  • page_title: "...": indicamos a Ansible que, cada vez que encuentre {{ page_title }} en una plantilla, debe reemplazarlo por "My LabEx Web Server".

Mantenga el archivo abierto para el siguiente paso.

Utilizar el módulo template

Ahora añadiremos la tarea que realiza el trabajo. Utilizamos el módulo template. Este módulo lee nuestro archivo .j2, completa las variables y guarda el resultado en el servidor.

En la práctica, el módulo template se utiliza para desplegar muchos archivos de configuración en entornos reales. En lugar de copiar un archivo estático, genera una versión específica para cada host a partir de un patrón común.

Añada la tarea a su playbook.yml. Preste atención a la indentación.

---
- name: Deploy Web Page
  hosts: localhost
  become: yes
  vars:
    page_title: "My LabEx Web Server"
  tasks:
    - name: Create index.html from template
      template:
        src: templates/index.html.j2
        dest: /var/www/html/index.html
        mode: "0644"

Comprender el código:

  • template:: es el módulo que utilizamos.
  • src: el archivo de origen, es decir, nuestra plantilla con los marcadores de posición.
  • dest: el destino, donde debe guardarse el archivo HTML final.
  • mode: "0644": establece los permisos del archivo para que el servidor web pueda leerlo.
  • become: yes: lo añadimos porque escribir en /var/www/html requiere permisos de root.

Guarde el archivo y salga.

Desplegar y verificar

Ejecutemos el playbook para comprobar el resultado.

Ejecute el playbook:

ansible-playbook -i inventory playbook.yml

Si funciona correctamente, verá un estado changed.

Ahora revisemos el archivo final que creó Ansible. Esperamos que los marcadores de posición hayan desaparecido y que se hayan reemplazado por texto real.

Lea el archivo HTML generado:

cat /var/www/html/index.html

Resultado esperado:

<html>
  <head>
    <title>My LabEx Web Server</title>
  </head>
  <body>
    <h1>Welcome to localhost</h1>
    <p>This file was generated by Ansible.</p>
  </body>
</html>

Como puede ver, {{ page_title }} se convirtió en "My LabEx Web Server" y {{ inventory_hostname }} se convirtió en "localhost".

Resumen

En este laboratorio, aprendió a hacer que sus configuraciones sean dinámicas.

  1. Plantillas: creó un archivo .j2 con {{ placeholders }}.
  2. Variables: definió valores en la sección vars del playbook.
  3. Variables mágicas: utilizó inventory_hostname, que Ansible proporciona automáticamente.
  4. Módulo template: utilizó el módulo template para combinar variables y plantillas en un archivo de configuración final.

Esta potente función le permite utilizar una sola plantilla para configurar miles de servidores, cada uno con sus propios detalles específicos.