Tipos de variables de Ansible: ¿Cómo utilizar variables en Ansible?

Las variables de Ansible son útiles para gestionar variaciones entre sistemas. Esta plataforma permite ejecutar playbooks y tareas en múltiples sistemas al mismo tiempo con un solo comando. Las diferencias entre sistemas pueden expresarse definiendo variables con sintaxis YAML, incluidos listas y diccionarios.

Estas variables pueden establecerse en distintos lugares, como la línea de comandos, archivos reutilizables o roles, el inventario o los playbooks. Además, durante la ejecución de un playbook pueden generarse nuevas variables asignando los valores de retorno de las tareas como variables.

En esta guía, repasaremos los conceptos de las variables en Ansible, analizando su uso, tipos y funcionamiento en detalle.

¿Cuál es la importancia de las variables en Ansible?

Ansible es una herramienta popular de gestión de configuración, ampliamente utilizada para administrar múltiples servidores de forma eficiente. Simplifica tareas como la preparación del servidor y la instalación de aplicaciones al automatizar procesos.

Con Ansible, puedes gestionar fácilmente un gran número de servidores remotos y ejecutar tareas de manera secuencial desde un nodo central de control. Esto agiliza las tareas de administración, mejora la productividad y garantiza la coherencia en toda tu infraestructura.

Las variables en Ansible son herramientas potentes para simplificar la gestión de valores dinámicos a lo largo de un proyecto, reduciendo la probabilidad de errores humanos. Ofrecen una forma cómoda de manejar variaciones y diferencias entre distintos entornos y sistemas.

Con variables, tenemos la flexibilidad de definirlas en diferentes ubicaciones, cada una con niveles de precedencia distintos, ajustados a nuestras necesidades. Además, Ansible permite registrar nuevas variables directamente dentro de los playbooks capturando la salida de las tareas, lo que amplía aún más las opciones de personalización.

Un tipo especialmente destacable de variable en Ansible son los Ansible facts, que aportan información valiosa obtenida desde los hosts remotos. Estos facts, accesibles mediante la variable ansible_facts, ofrecen datos sobre múltiples aspectos de los sistemas destino.

Por ejemplo, podemos obtener detalles de la distribución del sistema operativo (ansible_distribution) y (ansible_version), información sobre dispositivos del host, la versión de Python utilizada por Ansible (ansible_python_version), la arquitectura del sistema y más. Aprovechar los Ansible facts enriquece los proyectos al permitir decisiones mejor fundamentadas y flujos de automatización más eficientes.

Reglas de nombres de variables en Ansible

Las variables en Ansible se asignan siguiendo directrices específicas sobre convenciones de nombres.

En Ansible, el nombre de la variable debe comenzar con una letra mayúscula o minúscula. Por ejemplo, username, Saleprice, etc.
Las variables en Ansible pueden contener letras (mayúsculas, minúsculas o combinadas), guiones bajos y dígitos; por ejemplo: username, sale_price, foo23, etc.
Algunas cadenas o palabras clave están reservadas para funciones especiales y no pueden usarse como nombres válidos. Esto incluye palabras clave de Playbook y palabras reservadas de Python.
Aunque no es obligatorio, se recomienda usar nombres simples y descriptivos. Esta práctica simplifica tu trabajo con Ansible.

Tipos de variables en Ansible

Existen varios tipos de variables de Ansible que puedes definir y utilizar en un playbook de distintas maneras.

Simple Variables;
Special Variables (Connection variables, magic variables, Ansible facts);
Register Variables.

Variables simples de Ansible ()

El uso más básico de las variables simples consiste en definir una variable con un único valor dentro del archivo YAML del playbook.

Veamos un ejemplo sencillo de un playbook que imprime un mensaje.

  • name: Example Playbook with Variables

hosts: all

gather_facts: false

vars:

greeting_message: "Hello, welcome to Ansible variables understanding!"

tasks:

  • name: Display Greeting

debug:

msg: "{ greeting_message }"

En el playbook anterior, mostramos el uso de variables simples de Ansible:

name: Identifica el playbook y proporciona una descripción.
hosts: Indica los hosts destino donde se ejecutarán las tareas. En este caso, configuramos all.
tasks: Contiene la lista de tareas que se ejecutarán en los hosts especificados.
name: Describe la tarea.
greeting_message es una variable que contiene el mensaje "Hello, welcome to Ansible variables understanding!".
debug: Indica un módulo que se utiliza para imprimir mensajes con fines de depuración. La tarea debug muestra el valor de la variable greeting_message.
msg: Define el mensaje que se imprimirá.

Ejecuta el playbook y el valor de geeting_message se mostrará dentro de msg.

Variables de Ansible definidas dentro de una tarea (set variables)

Las Ansible set variables son variables definidas por el usuario que puedes declarar y asignar dentro de playbooks o roles. Normalmente se utilizan para almacenar información que puede cambiar según tu entorno o tus requisitos. Puedes definir variables en distintos niveles de alcance, por ejemplo de forma global, dentro de un playbook o en una tarea específica. Veamos un ejemplo:

  • name: Set variables

hosts: localhost

tasks:

  • name: Set user role variables

set_fact:

user_name: "supervisor"

user_permissions: "rwx"

  • name: Display user variables

debug:

msg: "The user '{ user_name }' has permissions '{ user_permissions }'"

Variables de Ansible con arrays y bucles

En Ansible, al igual que en lenguajes de programación, los arrays se usan para almacenar colecciones de elementos relacionados. Estas colecciones, llamadas arrays, pueden contener múltiples valores del mismo tipo de dato.

Veamos un ejemplo de un playbook de Ansible que utiliza variables con arrays/listas y muestra cómo iterar sobre ellas:

  • name: Example Playbook with Variable Arrays and Loops

hosts: all

gather_facts: false

vars:

fruits:

  • apple

  • banana

  • orange

tasks:

  • name: Display Fruits

debug:

msg: "The fruit is { item }"

loop: "{ fruits }"

En el playbook anterior, “fruits” es una variable que contiene un array/lista de frutas. La directiva loop se utiliza para iterar sobre el array fruits. Dentro del bucle, la tarea debug muestra cada fruta usando la variable item.

Variables especiales de Ansible

En Ansible, las variables especiales son variables predefinidas que contienen información importante sobre el sistema, el inventario o el contexto de ejecución del playbook. Las variables especiales de Ansible se agrupan en distintos tipos, como magic variables, connection variables y Ansible facts. Sus nombres están reservados, lo que significa que no puedes definir variables con los mismos nombres que estas variables especiales.

Ansible Facts

Los Ansible facts son datos recopilados sobre los hosts durante la ejecución del playbook. Este proceso, llamado gathering facts, obtiene información como la dirección IP del sistema, la fecha y hora actuales, especificaciones de BIOS, particiones de disco y otros detalles relevantes de hardware.

En este ejemplo:

Configuramos gather_facts en true, lo que indica a Ansible que recopile información de los hosts destino.

Luego utilizamos el módulo debug para mostrar algunos de los facts recopilados, como el hostname (ansible_hostname), la distribución (ansible_distribution) y su versión (ansible_distribution_version), y la memoria total (ansible_memtotal_mb).

Cuando ejecutas este playbook con ansible-playbook, Ansible recopila facts de todos los hosts especificados en tu archivo de inventario y muestra la información relevante para cada host. Aquí, recopilamos información solo para “localhost”.

Para ver los Ansible facts asociados a tu sistema local, ejecuta el siguiente comando:

$ sudo ansible -m setup localhost

El comando anterior usa el módulo setup para recopilar facts sobre el sistema “localhost”. Imprime una salida en formato JSON que contiene una amplia variedad de información del sistema local, como detalles de hardware, configuración de red, sistema operativo y más.

Variables mágicas de Ansible (magic variables)

Las Ansible magic variables son variables predefinidas que proporcionan información sobre el entorno de ejecución, el host actual u otros detalles contextuales. Las magic variables en Ansible se generan automáticamente y son inmutables, lo que significa que los usuarios no pueden modificar sus valores. Estas variables siempre representan el estado interno de Ansible y no pueden alterarse. Por ello, solo se pueden usar en su forma predefinida y no admiten personalización.

Ejemplo de uso de magic variables dentro de un playbook:

  • hosts: all

tasks:

  • debug:

var: ansible_version

Variables de conexión de Ansible (connection variables)

Las connection variables en Ansible funcionan como ajustes de configuración que determinan cómo Ansible establece conexiones con hosts remotos durante la ejecución de tareas y playbooks. Ofrecen flexibilidad para manejar diferentes tipos de conexión, mecanismos de autenticación y configuraciones específicas por host.

Veamos un ejemplo en el que ejecutamos el comando date en localhost.

  • name: Run Command on Localhost

hosts: localhost

connection: local

gather_facts: no

vars:

command_to_run: "date"

tasks:

  • name: Execute Command

ansible.builtin.shell: "{ command_to_run }"

register: command_output

  • name: Display Command Output

ansible.builtin.debug:

msg: "Command output: { command_output.stdout }"

En el ejemplo anterior:

name: Indica el nombre del playbook, que es "Run Command on Localhost."
hosts: Especifica los hosts destino del playbook. Aquí es localhost, lo que significa que el playbook se ejecutará solo en la máquina local.
connection: Indica cómo se conecta Ansible a los hosts destino. Al establecer local, Ansible ejecuta las tareas directamente en el nodo de control, que es la máquina local.
gather_facts: Controla si Ansible debe recopilar facts del host destino. Se establece en no, indicando que no se recopilarán facts.
vars: Define variables específicas del playbook. Aquí se define command_to_run con el valor "date", representando un comando de shell para obtener la fecha actual.
tasks: Contiene la lista de tareas que ejecutará Ansible.
name: Describe el propósito de la tarea: ejecutar un comando y mostrar su salida.
ansible.builtin.shell: Módulo que ejecuta comandos de shell en los hosts destino. Aquí ejecuta el comando indicado en command_to_run.
register: Captura la salida del comando de shell para usarla más adelante. La salida se almacena en command_output.
ansible.builtin.debug: Módulo para imprimir mensajes de depuración. Aquí muestra la salida capturada en command_output.stdout.

Tras ejecutar este playbook, verás que se ejecuta el comando date en localhost y se muestra la salida, que es la fecha y hora actuales.

Variables de registro de Ansible (register variables)

El módulo register en Ansible sirve para almacenar la salida de una tarea en una variable. Normalmente implica ejecutar una tarea en un host remoto usando módulos como shell o command. Una vez que register captura la salida, puede referenciarse en distintos contextos, como condicionales o impresión de resultados.

Veamos cómo se aplica register para capturar la salida de una tarea. En el playbook proporcionado, se ejecuta el comando free en un host local. El módulo register captura la salida y luego se muestra en la salida estándar (stdout).

  • name: Ansible Register Variable Example

hosts: localhost

tasks:

  • name: Get Memory Usage

shell: "free"

register: memory_usage

  • debug:

var: memory_usage.stdout

En este ejemplo:

El módulo shell se utiliza para ejecutar el comando free, que muestra información del uso de memoria. La salida de free se captura con register y se guarda en la variable memory_usage.

El módulo debug muestra la salida capturada usando el atributo stdout de la variable memory_usage.

Este playbook ejecuta free en localhost, pero puedes configurarlo para todos los hosts del archivo de inventario y mostrar la información de uso de memoria capturada de cada host.

Conclusión

En esta guía, profundizamos en las variables de Ansible, explorando cómo definirlas y referenciarlas en distintos escenarios. Al aprovechar variables, obtienes la capacidad de personalizar y parametrizar tus playbooks, mejorando la flexibilidad y la adaptabilidad.

Además, describimos buenas prácticas clave para simplificar el uso de variables en playbooks, logrando flujos de automatización más fluidos y reduciendo la complejidad. Mostramos cómo puedes utilizar distintos tipos de variables de Ansible en un playbook y ejecutarlo en tu sistema. Si utilizas un hosting remoto o un servidor VPS Linux, puedes aplicar las pautas anteriores y usar variables de Ansible en tu servidor Linux.

Para aprender más sobre variables de Ansible y explorar otras posibilidades, te recomendamos consultar la documentación oficial de Ansible. Allí encontrarás recursos completos y más información sobre variables de Ansible, lo que te permitirá aprovechar esta funcionalidad al máximo. Aprovecha la versatilidad de las variables de Ansible para optimizar tus estrategias de automatización y mejorar la eficiencia de tu infraestructura.

Blog