En Ansible, las variables se utilizan para almacenar valores que luego podemos reutilizar en nuestros playbooks. Estas variables permiten mantener la configuración más organizada y flexible. Una variable puede definirse de varias maneras, pero aquí tenemos un ejemplo básico:
# archivo vars.yml
mi_variable: "Este es el valor de mi variable"
Para usar esta variable en un playbook, primero tenemos cargar el archivo de variables (por ejemplo, vars.yml) y luego referenciar la variable utilizando la sintaxis Jinja2 (). Así sería un ejemplo sencillo:
- hosts: servidores
vars_files:
- vars.yml
tasks:
- name: Mostrar el valor de mi_variable
debug:
msg: "El valor es: "
Registrar la salida de las tareas ejecutadas usando variables
Para capturar la salida del primer comando y pasarlo al segundo usaremos la directiva register
con el primer comando, especificando un nombre de variable. La salida de ese comando se almacenará en esa variable. Para usarla posteriormente usaremos el módulo debug
con la opción var
.
---
- name: Check /etc/host file
hosts: all
tasks:
- shell: cat /etc/hosts
register: result
- debug:
var: result
Aquí tenemos la salida del ejemplo anterior, donde podemos ver el contenido de /etc/hosts de cada nodo además de información como el código de retorno (rc), el tiempo (delta) ,étc.
Si quisiéramos sacar el rc (return code = 0 existo !=0 fallido) usaríamos var: result.rc
Y si lo único que queremos, es ver el contenido de /etc/hosts sin más, usaremos la salida estándar (stdout)
Si dejamos el playbook sin register y sin debug podemos usar la opción -v al ejecutar el playbook
Variables mágicas (Magic Variables)
Son variables especiales que NO requieren una declaración previa porque son provistas automáticamente por el entorno de ejecución de Ansible. Son útiles para obtener información del entorno de ejecución, inventario o de los playbooks.
Algunas de las más comunes:
-
hostvars: Permite acceder a las variables de otros hosts en el inventario.
-
group_names: Lista con los nombres de los grupos a los que pertenece el host actual.
-
groups: Diccionario con todos los grupos en el inventario, mapeando cada grupo a sus hosts.
-
inventory_hostname: Nombre del host actual según el inventario.
-
playbook_dir: Directorio donde se encuentra el Playbook que se está ejecutando.
-
ansible_version: Versión de Ansible que se está utilizando.
-
ansible_check_mode: Indica si Ansible se está ejecutando en modo check (comprobación).
Ejemplo:
El siguiente playbook simplemente utiliza la tarea debug para imprimir la información de las Magic Variables. Es una manera útil de ver cómo funcionan y qué datos puedes obtener de ellas.
---
- name: Ejemplo de Magic Variables en Ansible
hosts: all
tasks:
- name: Mostrar la versión de Ansible
debug:
msg: "La versión de Ansible es "
- name: Mostrar el nombre del host actual según el inventario
debug:
msg: "El nombre del host es "
- name: Mostrar los grupos a los que pertenece el host actual
debug:
msg: "El host pertenece a los siguientes grupos: "
- name: Mostrar las variables de un host específico
debug:
msg: "Las variables del host son: "
-
Utilizamos ansible_version para mostrar la versión completa de Ansible.
-
Utilizamos inventory_hostname para mostrar el nombre del host actual según el inventario.
-
Utilizamos group_names para listar los grupos a los que pertenece el host actual.
-
Utilizamos hostvars para acceder a las variables del host específico actual.
El resultado de la ejecución sería el siguiente
Jinja2
Qué es Jinja2
Es un motor de plantillas que permite generar archivos de configuración y scripts personalizados. Podemos usar Jinja2 dentro de playbooks, plantillas y variables. Su extensión es .j2
Ejemplos
1 - Plantillas Jinja2 para archivos de configuración
Ejemplo de una plantilla de configuración para un archivo de hosts de Nginx. La plantilla podría verse así (nginx.conf.j2):
server {
listen ;
server_name ;
location / {
proxy_pass http://;
}
}
Y un Playbook que use esta plantilla:
---
- name: Configurar Nginx
hosts: webservers
vars:
http_port: 80
server_name: "example.com"
proxy_address: "192.168.1.1"
tasks:
- name: Plantilla de configuración para Nginx
template:
src: nginx.conf.j2
dest: /etc/nginx/sites-available/default
notify:
- Reiniciar Nginx
handlers:
- name: Reiniciar Nginx
service:
name: nginx
state: restarted
2 - Uso de Jinja2 en Playbooks
Ejemplo de Jinja2 directamente en los Playbooks para asignar valores a las variables o para condicionales.
---
- name: Ejemplo de uso de Jinja2 en Playbook
hosts: all
vars:
list_of_items: ["item1", "item2", "item3"]
tasks:
- name: Mostrar cada ítem en la lista
debug:
msg: ""
with_items: ""
- name: Mostrar un mensaje condicional
debug:
msg: "El host es un servidor de base de datos"
when: "'db' in group_names"
3 - Filtrado y manipulación de datos
Jinja2 también nos permite usar filtros para manipular datos. Aquí tenemos un ejemplo que muestra cómo filtrar y transformar una lista de elementos:
---
- name: Ejemplo de filtros Jinja2
hosts: all
vars:
my_list: [1, 2, 3, 4, 5]
tasks:
- name: Convertir lista a cadena de texto
debug:
msg: ""
- name: Obtener valores mayores que 3
debug:
msg: ""