Las plantillas en Ansible son una herramienta poderosa que permite a los usuarios generar archivos de configuración dinámicos basados en variables y lógica definida en los playbooks. Las plantillas se escriben en el lenguaje de plantillas Jinja2, que es un motor de plantillas para Python.

¿Qué es una Plantilla?

Una plantilla es un archivo de texto que contiene marcadores de posición para datos dinámicos. Estos marcadores de posición se reemplazan con valores reales cuando la plantilla se procesa. En Ansible, las plantillas se utilizan comúnmente para generar archivos de configuración que se despliegan en los nodos gestionados.

Ejemplo de Plantilla

Supongamos que queremos crear un archivo de configuración para un servidor web. La plantilla podría verse así:

server {
    listen 80;
    server_name {{ server_name }};
    
    location / {
        proxy_pass http://{{ backend_server }};
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

En este ejemplo, {{ server_name }} y {{ backend_server }} son marcadores de posición que se reemplazarán con valores reales cuando la plantilla se procese.

Uso de Plantillas en Ansible

Para usar una plantilla en Ansible, se utiliza el módulo template. Este módulo copia una plantilla desde el controlador de Ansible al nodo gestionado, reemplazando los marcadores de posición con los valores de las variables definidas en el playbook.

Ejemplo de Playbook con Plantilla

A continuación, se muestra un ejemplo de un playbook que utiliza una plantilla:

---
- name: Desplegar configuración del servidor web
  hosts: webservers
  vars:
    server_name: www.ejemplo.com
    backend_server: 192.168.1.10
  tasks:
    - name: Copiar archivo de configuración del servidor web
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/conf.d/default.conf
      notify:
        - Reiniciar Nginx

  handlers:
    - name: Reiniciar Nginx
      service:
        name: nginx
        state: restarted

Explicación del Playbook

  1. Definición del Playbook: El playbook se llama "Desplegar configuración del servidor web" y se ejecuta en los hosts del grupo webservers.
  2. Variables: Se definen dos variables: server_name y backend_server.
  3. Tarea de Plantilla: La tarea template copia la plantilla nginx.conf.j2 desde el directorio templates en el controlador de Ansible al archivo /etc/nginx/conf.d/default.conf en el nodo gestionado.
  4. Notificación: La tarea template notifica al manejador Reiniciar Nginx para reiniciar el servicio Nginx si la plantilla se ha copiado con éxito.
  5. Manejador: El manejador Reiniciar Nginx reinicia el servicio Nginx.

Ejercicio Práctico

Ejercicio

Crea un playbook que utilice una plantilla para generar un archivo de configuración de Apache. La plantilla debe incluir marcadores de posición para el nombre del servidor y el directorio raíz del documento.

Pasos:

  1. Crea una plantilla llamada apache.conf.j2 con el siguiente contenido:
<VirtualHost *:80>
    ServerName {{ server_name }}
    DocumentRoot {{ document_root }}
    <Directory "{{ document_root }}">
        AllowOverride All
        Require all granted
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
  1. Crea un playbook llamado deploy_apache.yml con el siguiente contenido:
---
- name: Desplegar configuración de Apache
  hosts: webservers
  vars:
    server_name: www.ejemplo.com
    document_root: /var/www/html
  tasks:
    - name: Copiar archivo de configuración de Apache
      template:
        src: templates/apache.conf.j2
        dest: /etc/apache2/sites-available/000-default.conf
      notify:
        - Reiniciar Apache

  handlers:
    - name: Reiniciar Apache
      service:
        name: apache2
        state: restarted

Solución

  1. Plantilla apache.conf.j2:
<VirtualHost *:80>
    ServerName {{ server_name }}
    DocumentRoot {{ document_root }}
    <Directory "{{ document_root }}">
        AllowOverride All
        Require all granted
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
  1. Playbook deploy_apache.yml:
---
- name: Desplegar configuración de Apache
  hosts: webservers
  vars:
    server_name: www.ejemplo.com
    document_root: /var/www/html
  tasks:
    - name: Copiar archivo de configuración de Apache
      template:
        src: templates/apache.conf.j2
        dest: /etc/apache2/sites-available/000-default.conf
      notify:
        - Reiniciar Apache

  handlers:
    - name: Reiniciar Apache
      service:
        name: apache2
        state: restarted

Resumen

En esta sección, hemos aprendido sobre las plantillas en Ansible y cómo utilizarlas para generar archivos de configuración dinámicos. Hemos visto un ejemplo práctico de cómo usar el módulo template en un playbook y hemos realizado un ejercicio para reforzar los conceptos aprendidos. Las plantillas son una herramienta esencial en Ansible para gestionar configuraciones de manera eficiente y flexible.

© Copyright 2024. Todos los derechos reservados