Las variables en Ansible permiten almacenar valores reutilizables que se pueden aplicar en tareas, plantillas y configuraciones a lo largo de un playbook o rol. Su uso mejora la flexibilidad, permite personalizar la automatización y facilita la gestión de configuraciones complejas. Las variables en Ansible pueden definirse en múltiples niveles, como en el inventario, en los playbooks, en roles o a nivel de grupo y host.
Las variables son identificadores que almacenan datos (números, cadenas, listas, diccionarios, etc.) que Ansible puede utilizar y referenciar en diferentes partes del código. Al definir variables, es posible adaptar playbooks para diferentes entornos, como desarrollo, staging y producción, sin necesidad de cambiar el código base.
En Ansible, las variables se definen en archivos YAML usando la sintaxis nombre_de_variable: valor
. Por ejemplo:
app_port: 8080
app_name: "mi_aplicacion"
debug_mode: true
Estas variables se pueden utilizar en los playbooks, tareas, roles y plantillas usando la sintaxis {{ nombre_de_variable }}
.
Ansible permite definir variables en distintos niveles, lo que influye en el orden de precedencia y cómo se aplican. A continuación, se muestran los lugares más comunes para definir variables:
inventory
)
Las variables se pueden definir en los archivos de inventario, ya sea a nivel de host o grupo. Por ejemplo, en un archivo INI:
[webservers]
web1.example.com ansible_user=admin app_env=production
web2.example.com ansible_user=admin app_env=staging
O en formato YAML dentro de inventory
:
all:
children:
webservers:
hosts:
web1.example.com:
app_env: production
web2.example.com:
app_env: staging
group_vars
y host_vars
Ansible permite definir variables específicas para grupos y hosts utilizando archivos en los directorios group_vars
y host_vars
. Por ejemplo:
app_port: 80
app_debug: false
app_port: 8081
app_debug: true
Las variables en group_vars
se aplican a todo el grupo, mientras que las de host_vars
solo afectan a un host específico.
Puedes definir variables en un *playbook* usando la directiva vars
:
- hosts: all
vars:
app_name: "mi_aplicacion"
app_version: "1.0.0"
tasks:
- name: Mostrar variables
debug:
msg: "Desplegando la aplicación {{ app_name }} versión {{ app_version }}"
defaults
y vars
)
Dentro de un rol, las variables se pueden definir en:
defaults/main.yml
: Variables con menor prioridad que se pueden sobrescribir fácilmente.
vars/main.yml
: Variables con mayor prioridad dentro del rol.
Puedes pasar variables directamente al ejecutar un playbook:
ansible-playbook mi_playbook.yml -e "app_env=production db_port=3306"
Estas variables tienen la prioridad más alta.
Las plantillas utilizan variables para generar configuraciones dinámicas. Dentro de un archivo de plantilla .j2
, puedes utilizar variables definidas en el playbook o rol:
server {
listen {{ app_port }};
server_name {{ app_name }}.local;
}
- hosts: webservers
vars:
app_name: "mi_aplicacion"
app_port: 8080
tasks:
- name: Crear un archivo con el nombre de la aplicación
copy:
content: "Nombre de la aplicación: {{ app_name }}\nPuerto: {{ app_port }}"
dest: /tmp/app_info.txt
Resultado: Se crea un archivo /tmp/app_info.txt
con el contenido:
Nombre de la aplicación: mi_aplicacion
Puerto: 8080
group_vars
y host_vars
Si tienes un archivo group_vars/webservers.yml
:
# group_vars/webservers.yml
app_user: "webadmin"
app_dir: "/var/www/html"
Y un archivo host_vars/web1.example.com.yml
:
# host_vars/web1.example.com.yml
app_port: 8080
Puedes referenciar estas variables en un *playbook*:
- hosts: webservers
tasks:
- name: Crear directorio de la aplicación
file:
path: "{{ app_dir }}"
state: directory
owner: "{{ app_user }}"
- name: Configurar la aplicación en el puerto {{ app_port }}
command: echo "Puerto de la aplicación: {{ app_port }}"
defaults/main.yml
)
Dentro de un rol llamado apache
, puedes definir variables por defecto en defaults/main.yml
:
# apache/defaults/main.yml
apache_port: 80
apache_service: "httpd"
Y usarlas en tasks/main.yml
:
- name: Asegurarse de que Apache esté instalado
yum:
name: "{{ apache_service }}"
state: present
- name: Iniciar el servicio de Apache
service:
name: "{{ apache_service }}"
state: started
El orden de precedencia (de menor a mayor) es importante cuando se utilizan variables en diferentes niveles. La precedencia es la siguiente:
1. Variables en defaults/main.yml
de un rol.
2. Variables definidas en group_vars
y host_vars
.
3. Variables en el inventario (inventory
).
4. Variables definidas en el playbook (vars
).
5. Variables en vars/main.yml
de un rol.
6. Variables definidas con -e
(línea de comandos).
Este orden permite sobrescribir las variables cuando sea necesario y garantiza que las configuraciones sean consistentes.
1. Usa nombres descriptivos: Utiliza nombres de variables que describan claramente su propósito (db_user
, web_port
, etc.).
2. Evita hardcodear valores: Define variables para rutas, puertos y configuraciones en lugar de codificarlas en tareas.
3. Agrupa variables en group_vars
y host_vars
: Facilita la gestión de entornos complejos organizando las variables a nivel de grupo o host.
4. Documenta las variables: Incluye comentarios en los archivos de variables para explicar su uso y valores posibles.
5. Utiliza vars_files
para cargar variables externas: Carga variables desde archivos externos para facilitar la gestión:
- hosts: all
vars_files:
- vars/global_vars.yml
Para más detalles sobre las variables y su uso en Ansible, consulta la documentación oficial de Ansible sobre Variables.
Jorge García
Fullstack developer