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. 🚀