Los templates (plantillas) en Ansible permiten crear archivos de configuración dinámicos utilizando el motor de plantillas Jinja2. Las plantillas son archivos de texto que contienen variables, estructuras de control y lógica condicional, permitiendo personalizar configuraciones en función de las variables de Ansible. Esto es ideal para generar archivos de configuración adaptados a diferentes entornos, como archivos de configuración de servicios, scripts personalizados y más.
Un *template* en Ansible es un archivo con extensión .j2
que utiliza la sintaxis de Jinja2 para definir variables, bucles y condicionales. Estas plantillas se rellenan con datos de las variables definidas en el inventario, en el playbook o en los roles y luego se copian a los servidores gestionados. La tarea principal que maneja las plantillas en Ansible es el módulo template
.
Una plantilla básica en Ansible puede verse de la siguiente manera:
# plantilla.j2
server_name: {{ app_server }}
listen {{ port }};
Las variables {{ app_server }}
y {{ port }}
se reemplazarán con sus valores correspondientes definidos en el playbook o en los archivos de variables.
template
en Ansible?
El módulo template
se utiliza para copiar archivos de plantillas Jinja2 desde la máquina de control a los servidores de destino, reemplazando las variables con sus valores. La sintaxis básica es:
- name: Copiar plantilla de configuración
template:
src: ruta_de_origen.j2
dest: /ruta/en/el/servidor/destino.conf
src
: Especifica la ruta del archivo de plantilla en la máquina local.
dest
: Define la ubicación en el servidor de destino donde se creará el archivo final con el contenido de la plantilla.
Supongamos que tienes un archivo de plantilla nginx.conf.j2
con el siguiente contenido:
# nginx.conf.j2
server {
listen {{ port }};
server_name {{ server_name }};
location / {
proxy_pass http://{{ backend_server }};
}
}
Y un playbook que usa esta plantilla:
- hosts: webservers
vars:
port: 80
server_name: "example.com"
backend_server: "127.0.0.1:3000"
tasks:
- name: Copiar archivo de configuración de Nginx usando plantilla
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Reiniciar Nginx
handlers:
- name: Reiniciar Nginx
service:
name: nginx
state: restarted
En este ejemplo:
nginx.conf.j2
se genera en el servidor de destino como /etc/nginx/nginx.conf
con las variables port
, server_name
y backend_server
reemplazadas por sus valores.
Reiniciar Nginx
para aplicar la nueva configuración.
Supongamos que necesitas generar un archivo de configuración que lista varios servidores backend. Puedes crear una plantilla con un bucle for
para iterar sobre las variables:
# backend_servers.conf.j2
upstream backend {
{% for server in backend_servers %}
server {{ server.host }}:{{ server.port }};
{% endfor %}
}
En el playbook, define la lista de servidores backend:
- hosts: loadbalancers
vars:
backend_servers:
- { host: "192.168.1.10", port: 8080 }
- { host: "192.168.1.11", port: 8080 }
- { host: "192.168.1.12", port: 8080 }
tasks:
- name: Generar archivo de configuración de servidores backend
template:
src: backend_servers.conf.j2
dest: /etc/nginx/conf.d/backend_servers.conf
El archivo generado en el servidor de destino tendrá el siguiente contenido:
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
Puedes usar estructuras de control como if
para incluir lógica condicional dentro de las plantillas. Por ejemplo:
# app_config.j2
[application]
name = "{{ app_name }}"
debug = {% if debug %}true{% else %}false{% endif %}
Y luego, en el playbook, se definen las variables:
- hosts: all
vars:
app_name: "mi_aplicacion"
debug: true
tasks:
- name: Generar archivo de configuración de la aplicación
template:
src: app_config.j2
dest: /etc/app/config.ini
El archivo generado se verá así:
[application]
name = "mi_aplicacion"
debug = true
Si defines variables en group_vars
o host_vars
, también puedes usarlas en las plantillas. Supón que tienes el siguiente archivo group_vars/webservers.yml
:
app_user: "webadmin"
app_dir: "/var/www/html"
Puedes utilizar estas variables en una plantilla:
# config.j2
[app]
user = "{{ app_user }}"
directory = "{{ app_dir }}"
Y luego, en el playbook:
- hosts: webservers
tasks:
- name: Generar archivo de configuración con variables de grupo
template:
src: config.j2
dest: /etc/app/app.conf
Esto generará el archivo con las variables definidas en group_vars
.
1. Usa nombres descriptivos para las plantillas: Nombrar las plantillas de forma clara (nginx_site.conf.j2
, app_config.ini.j2
) facilita la gestión.
2. Documenta las variables dentro de la plantilla: Agrega comentarios en el archivo .j2
para indicar qué variables se esperan y su propósito.
3. Utiliza estructuras de control de Jinja2 con moderación: Si bien Jinja2 permite realizar lógica compleja, es recomendable mantener las plantillas simples y evitar lógica innecesaria.
4. Evita valores por defecto en las plantillas: Define valores por defecto en el playbook o en archivos defaults para roles, en lugar de hacerlo directamente en la plantilla.
5. Valida las plantillas antes de ejecutarlas: Si es un archivo de configuración, usa módulos como command
o shell
para validar la configuración generada (por ejemplo, nginx -t
).
Para más detalles sobre el uso de plantillas en Ansible, consulta la documentación oficial de Ansible sobre el módulo template
. Además, puedes aprender más sobre la sintaxis y capacidades de Jinja2 en la documentación oficial de Jinja2.
Jorge García
Fullstack developer