Templates y Jinja2 en Ansible

Cuando gestionamos configuraciones con Ansible, es común necesitar archivos dinámicos que se adapten a diferentes servidores o entornos. Para lograr esto, Ansible utiliza Templates con el motor de plantillas Jinja2, permitiéndonos generar archivos personalizados con variables y lógica condicional.

En este artículo, veremos cómo funcionan los templates en Ansible y cómo usarlos en nuestros playbooks.


1. ¿Qué son los Templates en Ansible?

Los Templates son archivos de texto con la extensión .j2 que contienen contenido estático y dinámico, utilizando la sintaxis de Jinja2 para personalizar valores.

Ejemplo de un archivo de configuración de Apache (apache.conf.j2):

ServerName {{ ansible_hostname }}
Listen {{ http_port }}
DocumentRoot /var/www/html

Aquí usamos {{ ansible_hostname }} y {{ http_port }} como variables que Ansible sustituirá con los valores del inventario o del playbook.

2. Cómo usar Templates en Ansible

Para utilizar un template en un playbook, usamos el módulo template.

Ejemplo de un playbook que genera apache.conf:

- name: Configurar Apache con Templates
  hosts: nodos_web
  become: yes
  vars:
    http_port: 8080
  tasks:
    - name: Generar archivo de configuración de Apache
      template:
        src: templates/apache.conf.j2
        dest: /etc/apache2/apache.conf
      notify: Reiniciar Apache

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

En este caso, Ansible sustituirá {{ http_port }} por 8080 y creará el archivo /etc/apache2/apache.conf.

3. Uso de Condicionales y Bucles en Templates

Podemos agregar lógica con if y for dentro del template.

Ejemplo con un bloque condicional:

{% if http_port == 80 %}
# Apache está configurado en el puerto estándar
{% else %}
# Apache está configurado en el puerto {{ http_port }}
{% endif %}

Ejemplo con un bucle para definir múltiples VirtualHosts:

{% for site in virtual_hosts %}
<VirtualHost *:{{ site.port }}>
    ServerName {{ site.name }}
    DocumentRoot {{ site.document_root }}
</VirtualHost>
{% endfor %}

En el playbook, definimos la variable virtual_hosts:

vars:
  virtual_hosts:
    - name: ejemplo.com
      port: 80
      document_root: /var/www/ejemplo
    - name: otro.com
      port: 8080
      document_root: /var/www/otro

4. Integración de Templates con Roles

Si trabajamos con roles, guardamos los templates en roles/apache/templates/ y los usamos en roles/apache/tasks/main.yml:

- name: Generar archivo de configuración
  template:
    src: apache.conf.j2
    dest: /etc/apache2/apache.conf
  notify: Reiniciar Apache

Esto permite una mejor organización y reutilización.


Los Templates y Jinja2 en Ansible nos permiten generar archivos de configuración flexibles y dinámicos, optimizando la automatización. Gracias a ellos, podemos personalizar la configuración de cada servidor de forma sencilla.

En el próximo post, hablaremos sobre Cómo utilizar Vault en Ansible para manejar credenciales de forma segura. 🚀