Volver a la página principal
lunes 7 octubre 2024
34

Cómo usar Variables en Ansible

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.

¿Qué son las Variables en Ansible?

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.

Sintaxis básica para definir variables

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

¿Dónde se pueden definir las Variables en Ansible?

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:

1. Inventario (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

2. Archivos 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:

  • group_vars/webservers.yml:
app_port: 80
app_debug: false
  • host_vars/web1.example.com.yml:
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.

3. Playbooks

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 }}"

4. Roles (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.

5. Línea de comandos

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.

6. Plantillas Jinja2

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;
}

Ejemplos de Uso de Variables en Ansible

1. Definir variables en un *playbook*

- 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

2. Variables en 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 }}"

3. Variables en un rol (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

Precedencia de Variables en Ansible

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.

Buenas Prácticas para Usar Variables en Ansible

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

Referencia oficial

Para más detalles sobre las variables y su uso en Ansible, consulta la documentación oficial de Ansible sobre Variables.

Etiquetas:
ansible
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer