Gestión de Variables en Ansible: Definición y Uso Avanzado

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"

Etiquetas: Ansible configuration-management variables YAML Jinja2

Publicado el 6-25 02:16