Las variables en Ansible son fundamentales para crear configuraciones dinámicas y reutilizables, evitando la duplicación de datos en los playbooks.
Definición de Variables en el Inventario de Hosts
Las variables pueden asignarse directamente en el archivo de inventario, ofreciendo una prioridad superior a las definidas en ansible.cfg.
Ejemplo de asginación en el archivo hosts:
anfitrion_principal
nodo1 puerto=443
nodo2
[grupo_nodos]
nodo1
nodo2
[grupo_nodos:vars]
sistema_operativo=ubuntu
También se pueden crear directorios host_vars y group_vars con archivos YAML para una gestión más estructurada.
# Ejemplo para un host específico
nombre_host: produccion01
# Ejemplo para un grupo de hosts
configuracion_grupo: basica
Definición de Variables dentro de Playbooks
Uso de la directiva vars
Define variables con alcance local al playbook.
- hosts: nodos_aplicacion
vars:
usuario_aplicacion: app_user
ruta_logs: /var/log/app
tasks:
- name: Verificar ruta de logs
debug:
msg: "La ruta de logs es {{ ruta_logs }}"
Uso de vars_files
Importa variables desde archivos externos YAML. La estructura debe ser un diccionario, no una lista.
# contenido de archivo_vars.yml
base_datos:
host: db.example.com
puerto: 5432
nombre: mi_aplicacion
- hosts: backend
vars_files:
- archivo_vars.yml
tasks:
- name: Mostrar host de la base de datos
debug:
var: base_datos.host
Variables de Registro (register)
Almacena el resultado de una tarea para su uso posterior, permitiendo ejecutar lógica condicional.
- hosts: todos
tasks:
- name: Verificar si el servicio está activo
command: systemctl is-active nginx
register: estado_servicio
ignore_errors: yes
- name: Notificar estado del servicio
debug:
msg: "El servicio está: {{ estado_servicio.stdout }}"
when: estado_servicio.rc == 0
Paso de Vraiables por Línea de Comandos
Se pueden proporcionar valores de variables durante la ejecución del playbook con la opción -e.
ansible-playbook despliegue.yml -e "version=2.5.1"
Variables de Hecho (Facts)
Son recopiladas automáticamente desde los hosts controlados por el módulo setup. Se pueden filtrar usando parámetros.
# Obtener solo la familia del sistema operativo
ansible nodo1 -m setup -a "filter=ansible_os_family"
# Usar un comodín para obtener múltiples facts relacionados
ansible nodo1 -m setup -a "filter=ansible_distribution*"
Para desactivar la recolección automática en un playbook:
- hosts: nodos_web
gather_facts: no
tasks:
- name: Tarea sin hechos recolectados
debug:
msg: "Ejecutando tarea"
Módulo set_fact
Genera nuevas variables en tiempo de ejecución, útil para crear variables derivadas o consolidar información.
- hosts: aplicacion
tasks:
- name: Construir etiqueta de versión completa
set_fact:
etiqueta_version: "{{ ansible_distribution }}_{{ ansible_distribution_version }}"
- name: Definir directorio de trabajo personalizado
set_fact:
dir_trabajo: "/opt/apps/{{ inventory_hostname }}"
- name: Mostrar variables generadas
debug:
var: etiqueta_version
Variables de Búsqueda (lookup)
Permiten obtener datos de diversas fuentes en el controlador y asignarlos a variables.
- hosts: servidor_config
tasks:
- name: Cargar contenido de un archivo local
set_fact:
plantilla_conf: "{{ lookup('file', 'plantillas/nginx.conf.j2') }}"
- name: Capturar salida de un comando local
set_fact:
marca_temporal: "{{ lookup('pipe', 'date -u +%Y%m%d%H%M%S') }}"
- name: Obtener una variable de entorno
set_fact:
directorio_trabajo: "{{ lookup('env', 'PROJECT_DIR') }}"
- name: Usar variables obtenidas
debug:
msg: "La plantilla tiene {{ plantilla_conf | length }} caracteres. Marca: {{ marca_temporal }}"
Variables Mágicas (Predefinidas)
Proporcionan información contextual sobre la ejecución actual y el entorno.
hostvars
Accede a las variables (incluyendo facts) de cualquier host gestionado.
- hosts: balanceador
tasks:
- name: Obtener IP de un servidor de backend
debug:
msg: "El servidor backend01 tiene la IP {{ hostvars['backend01'].ansible_default_ipv4.address }}"
inventory_hostname
Representa el nombre del host tal como está definido en el inventario. Útil para condicionales.
- hosts: nodos
tasks:
- name: Ejecutar solo en un host específico
shell: /scripts/tarea_especial.sh
when: inventory_hostname == 'nodo_critico'
groups y group_names
groups es un diccionario con todos los grupos y sus hosts. group_names es una lista de los grupos al que pertenece el host actual.
- hosts: todos
tasks:
- name: Listar todos los hosts en el grupo 'produccion'
debug:
msg: "{{ groups['produccion'] }}"
- name: Tarea solo para hosts en el grupo 'webserver'
debug:
msg: "Este es un servidor web"
when: "'webserver' in group_names"