Introducción
Las hostvars de Ansible son variables esenciales que almacenan información sobre cada host gestionado en tu infraestructura. Estas variables te permiten crear flujos de trabajo de automatización dinámicos y flexibles que se adaptan a diferentes servidores y entornos.
En este laboratorio práctico, aprenderás a trabajar con las hostvars de Ansible desde cero. Configurarás un inventario simple, accederás a las hostvars en playbooks, las usarás en plantillas y explorarás casos de uso prácticos. Al final de este laboratorio, comprenderás cómo aprovechar las hostvars para hacer que tu automatización de Ansible sea más potente y adaptable.
Configuración del Entorno de Laboratorio
Antes de adentrarnos en las hostvars de Ansible, necesitamos configurar nuestro entorno de trabajo. En este paso, instalaremos Ansible, crearemos una estructura de directorios para el proyecto y prepararemos nuestro archivo de inventario.
Instalación de Ansible
Comencemos instalando Ansible en nuestro sistema:
sudo apt update
sudo apt install -y ansible
Después de la instalación, verifica que Ansible se haya instalado correctamente:
ansible --version
Deberías ver una salida similar a esta:
ansible [core 2.12.x]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
ansible collection location = /home/labex/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.10.x (default, Mar 15 2023, 11:42:32) [GCC 11.3.0]
jinja version = 3.0.3
libyaml = True
Creación de la Estructura del Proyecto
Ahora, creemos una estructura de directorios adecuada para nuestro proyecto de Ansible:
mkdir -p ~/project/ansible_hostvars/inventory
mkdir -p ~/project/ansible_hostvars/group_vars
mkdir -p ~/project/ansible_hostvars/playbooks
mkdir -p ~/project/ansible_hostvars/templates
cd ~/project/ansible_hostvars
Creación de un Archivo de Inventario
Ansible utiliza archivos de inventario para definir los hosts y grupos que gestionará. Creemos un archivo de inventario simple con algunos hosts de ejemplo:
cat > ~/project/ansible_hostvars/inventory/hosts << 'EOF'
[webservers]
web01 ansible_host=192.168.1.10 http_port=80 max_connections=100
web02 ansible_host=192.168.1.11 http_port=8080 max_connections=200
[dbservers]
db01 ansible_host=192.168.1.20 db_port=3306 backup_dir=/var/backups
db02 ansible_host=192.168.1.21 db_port=5432 backup_dir=/opt/backups
[all:vars]
ansible_connection=local
ansible_user=labex
environment=development
EOF
En este archivo de inventario:
- Hemos definido dos grupos:
webserversydbservers. - Cada host tiene variables específicas como
http_portodb_port. - Hemos establecido variables globales para todos los hosts bajo
[all:vars]. - Estamos utilizando
ansible_connection=localya que este es un entorno de laboratorio.
Creemos también un archivo ansible.cfg simple en el directorio de nuestro proyecto:
cat > ~/project/ansible_hostvars/ansible.cfg << 'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
EOF
Ahora, verifiquemos nuestro inventario:
cd ~/project/ansible_hostvars
ansible-inventory --list
Deberías ver una salida en formato JSON que muestra todos los hosts y sus variables en tu inventario.
¡Felicidades! Has configurado correctamente tu entorno de Ansible y creado un inventario con variables de host. En el siguiente paso, exploraremos cómo acceder a estas variables utilizando hostvars.
Explorando las Hostvars de Ansible
Ahora que tenemos nuestro entorno configurado, exploremos las hostvars de Ansible y aprendamos cómo acceder a ellas en los playbooks.
Comprendiendo las Hostvars
En Ansible, hostvars es una variable especial que contiene información sobre todos los hosts en tu inventario. Es un diccionario donde las claves son los nombres de host y los valores son diccionarios que contienen todas las variables definidas para cada host.
Creemos un playbook simple para explorar las hostvars:
cat > ~/project/ansible_hostvars/playbooks/explore_hostvars.yml << 'EOF'
---
- name: Explore hostvars
hosts: all
gather_facts: no
tasks:
- name: Display host variables for the current host
debug:
msg: "Host: {{ inventory_hostname }} has the following variables: {{ hostvars[inventory_hostname] }}"
- name: Display a specific variable for the current host
debug:
msg: "Host {{ inventory_hostname }} has environment: {{ hostvars[inventory_hostname]['environment'] }}"
EOF
Ahora, ejecutemos este playbook:
cd ~/project/ansible_hostvars
ansible-playbook playbooks/explore_hostvars.yml
Deberías ver una salida con las variables de cada host. La primera tarea muestra todas las variables para cada host, mientras que la segunda tarea muestra una variable específica.
Creación de un Playbook de Variables Específicas por Host
Creemos otro playbook que demuestre cómo acceder a diferentes tipos de variables de host:
cat > ~/project/ansible_hostvars/playbooks/host_specific_vars.yml << 'EOF'
---
- name: Working with host-specific variables
hosts: all
gather_facts: no
tasks:
- name: Display web server information
debug:
msg: "Web server {{ inventory_hostname }} running on port {{ hostvars[inventory_hostname]['http_port'] | default('N/A') }}"
when: inventory_hostname in groups['webservers']
- name: Display database server information
debug:
msg: "Database server {{ inventory_hostname }} running on port {{ hostvars[inventory_hostname]['db_port'] | default('N/A') }}"
when: inventory_hostname in groups['dbservers']
EOF
Ejecuta este playbook:
cd ~/project/ansible_hostvars
ansible-playbook playbooks/host_specific_vars.yml
Deberías ver una salida que muestra información diferente para los servidores web y los servidores de bases de datos, basándose en sus variables respectivas.
Acceso a Variables de Otros Hosts
Una de las características potentes de hostvars es que puedes acceder a las variables de cualquier host en tu inventario. Creemos un playbook que demuestre esto:
cat > ~/project/ansible_hostvars/playbooks/cross_host_vars.yml << 'EOF'
---
- name: Access variables from other hosts
hosts: web01
gather_facts: no
tasks:
- name: Display information about web01 and db01
debug:
msg: |
Web server: {{ inventory_hostname }}
Web server port: {{ hostvars[inventory_hostname]['http_port'] }}
Database server: db01
Database port: {{ hostvars['db01']['db_port'] }}
Backup directory: {{ hostvars['db01']['backup_dir'] }}
EOF
Ejecuta este playbook:
cd ~/project/ansible_hostvars
ansible-playbook playbooks/cross_host_vars.yml
Deberías ver una salida que muestra información tanto de web01 como de db01, a pesar de que el playbook solo se está ejecutando en web01.
Esto demuestra cómo las hostvars te dan acceso a las variables de todos los hosts en tu inventario, permitiéndote crear relaciones y dependencias complejas entre hosts en tu automatización.
Uso de Hostvars en Plantillas
Las plantillas son una de las características más potentes de Ansible, y se vuelven aún más potentes cuando se combinan con hostvars. En este paso, aprenderemos a usar hostvars dentro de plantillas Jinja2 para crear archivos de configuración dinámicos.
Introducción a las Plantillas Jinja2
Ansible utiliza el motor de plantillas Jinja2 para generar contenido dinámico. Las plantillas te permiten crear archivos de configuración que se adaptan a diferentes hosts y escenarios.
Creemos una plantilla de configuración simple para un servidor web:
mkdir -p ~/project/ansible_hostvars/templates
cat > ~/project/ansible_hostvars/templates/nginx.conf.j2 << 'EOF'
## Server configuration for {{ inventory_hostname }}
## Generated by Ansible
server {
listen {{ hostvars[inventory_hostname]['http_port'] | default(80) }};
server_name {{ inventory_hostname }};
root /var/www/html;
## Environment: {{ hostvars[inventory_hostname]['environment'] }}
## Max connections: {{ hostvars[inventory_hostname]['max_connections'] | default(50) }}
location / {
index index.html index.htm;
}
}
EOF
Ahora, creemos una plantilla de configuración de base de datos:
cat > ~/project/ansible_hostvars/templates/db.conf.j2 << 'EOF'
## Database configuration for {{ inventory_hostname }}
## Generated by Ansible
port = {{ hostvars[inventory_hostname]['db_port'] }}
backup_directory = {{ hostvars[inventory_hostname]['backup_dir'] }}
environment = {{ hostvars[inventory_hostname]['environment'] }}
## Database hosts in environment:
{% for host in groups['dbservers'] %}
## - {{ host }} ({{ hostvars[host]['ansible_host'] }})
{% endfor %}
EOF
Creación de un Playbook para Aplicar Plantillas
Creemos un playbook que aplique estas plantillas:
cat > ~/project/ansible_hostvars/playbooks/apply_templates.yml << 'EOF'
---
- name: Apply configuration templates
hosts: all
gather_facts: no
tasks:
- name: Create output directory
file:
path: ~/project/ansible_hostvars/output
state: directory
run_once: true
- name: Apply web server configuration template
template:
src: ../templates/nginx.conf.j2
dest: ~/project/ansible_hostvars/output/{{ inventory_hostname }}-nginx.conf
when: inventory_hostname in groups['webservers']
- name: Apply database configuration template
template:
src: ../templates/db.conf.j2
dest: ~/project/ansible_hostvars/output/{{ inventory_hostname }}-db.conf
when: inventory_hostname in groups['dbservers']
EOF
Ahora, ejecutemos este playbook:
cd ~/project/ansible_hostvars
ansible-playbook playbooks/apply_templates.yml
Después de ejecutar el playbook, verifica los archivos de configuración generados:
ls -l ~/project/ansible_hostvars/output/
Deberías ver archivos de configuración generados para cada host. Examinemos una de las configuraciones del servidor web:
cat ~/project/ansible_hostvars/output/web01-nginx.conf
Y una de las configuraciones de la base de datos:
cat ~/project/ansible_hostvars/output/db01-db.conf
Observa cómo las plantillas utilizan hostvars para generar dinámicamente configuraciones adaptadas a cada host.
Uso de Bucles y Condicionales en Plantillas
Las plantillas pueden usar bucles y condicionales para crear contenido aún más dinámico. Creemos una plantilla completa de archivo de hosts:
cat > ~/project/ansible_hostvars/templates/hosts.j2 << 'EOF'
## Hosts file generated by Ansible
127.0.0.1 localhost
## Web servers
{% for host in groups['webservers'] %}
{{ hostvars[host]['ansible_host'] }} {{ host }}
{% endfor %}
## Database servers
{% for host in groups['dbservers'] %}
{{ hostvars[host]['ansible_host'] }} {{ host }}
{% endfor %}
EOF
Agreguemos una tarea a nuestro playbook para aplicar esta plantilla:
cat > ~/project/ansible_hostvars/playbooks/hosts_template.yml << 'EOF'
---
- name: Create hosts file from template
hosts: localhost
gather_facts: no
tasks:
- name: Create output directory
file:
path: ~/project/ansible_hostvars/output
state: directory
- name: Generate hosts file
template:
src: ../templates/hosts.j2
dest: ~/project/ansible_hostvars/output/hosts
EOF
Ejecuta este playbook:
cd ~/project/ansible_hostvars
ansible-playbook playbooks/hosts_template.yml
Verifica el archivo de hosts generado:
cat ~/project/ansible_hostvars/output/hosts
Deberías ver un archivo de hosts con todos tus servidores web y de bases de datos, generado dinámicamente desde tu inventario.
Técnicas Avanzadas de Hostvars
Ahora que has dominado los conceptos básicos de hostvars, exploremos algunas técnicas avanzadas para trabajar con ellos en Ansible.
Uso de Variables de Grupo con Hostvars
Las variables de grupo te permiten definir variables que se aplican a grupos enteros de hosts. Creemos un archivo de variables de grupo en la ubicación correcta dentro de nuestro directorio de inventario:
mkdir -p ~/project/ansible_hostvars/inventory/group_vars
cat > ~/project/ansible_hostvars/inventory/group_vars/webservers.yml << 'EOF'
---
web_server_type: nginx
default_document_root: /var/www/html
enable_ssl: true
ssl_cert_path: /etc/ssl/certs
EOF
Y otro para los servidores de bases de datos:
cat > ~/project/ansible_hostvars/inventory/group_vars/dbservers.yml << 'EOF'
---
backup_frequency: daily
backup_retention: 7
monitoring_enabled: true
alert_email: admin@example.com
EOF
Ahora, creemos un playbook que acceda a estas variables de grupo a través de hostvars:
cat > ~/project/ansible_hostvars/playbooks/group_vars_demo.yml << 'EOF'
---
- name: Demonstrate group variables with hostvars
hosts: all
gather_facts: no
tasks:
- name: Display web server group variables
debug:
msg: |
Host: {{ inventory_hostname }}
Web Server Type: {{ hostvars[inventory_hostname]['web_server_type'] | default('N/A') }}
Document Root: {{ hostvars[inventory_hostname]['default_document_root'] | default('N/A') }}
SSL Enabled: {{ hostvars[inventory_hostname]['enable_ssl'] | default('N/A') }}
when: inventory_hostname in groups['webservers']
- name: Display database server group variables
debug:
msg: |
Host: {{ inventory_hostname }}
Backup Frequency: {{ hostvars[inventory_hostname]['backup_frequency'] | default('N/A') }}
Backup Retention: {{ hostvars[inventory_hostname]['backup_retention'] | default('N/A') }}
Monitoring Enabled: {{ hostvars[inventory_hostname]['monitoring_enabled'] | default('N/A') }}
when: inventory_hostname in groups['dbservers']
EOF
Ejecuta este playbook:
cd ~/project/ansible_hostvars
ansible-playbook playbooks/group_vars_demo.yml
Deberías ver una salida que muestra cómo las variables de grupo están disponibles a través de hostvars.
Creación de Informes de Inventario Dinámicos
Creemos un playbook que genere informes basados en datos de inventario:
cat > ~/project/ansible_hostvars/playbooks/inventory_report.yml << 'EOF'
---
- name: Generate inventory reports
hosts: localhost
gather_facts: no
tasks:
- name: Create output directory
file:
path: ~/project/ansible_hostvars/output
state: directory
- name: Generate web servers report
template:
src: ../templates/web_report.j2
dest: ~/project/ansible_hostvars/output/web_servers_report.txt
- name: Generate database servers report
template:
src: ../templates/db_report.j2
dest: ~/project/ansible_hostvars/output/db_servers_report.txt
EOF
Ahora, creemos las plantillas para estos informes:
cat > ~/project/ansible_hostvars/templates/web_report.j2 << 'EOF'
========================================
WEB SERVERS INVENTORY REPORT
========================================
{% for host in groups['webservers'] %}
HOST: {{ host }}
IP Address: {{ hostvars[host]['ansible_host'] }}
HTTP Port: {{ hostvars[host]['http_port'] }}
Max Connections: {{ hostvars[host]['max_connections'] | default('Not specified') }}
Web Server Type: {{ hostvars[host]['web_server_type'] | default('Not specified') }}
Environment: {{ hostvars[host]['environment'] }}
{% endfor %}
EOF
cat > ~/project/ansible_hostvars/templates/db_report.j2 << 'EOF'
========================================
DATABASE SERVERS INVENTORY REPORT
========================================
{% for host in groups['dbservers'] %}
HOST: {{ host }}
IP Address: {{ hostvars[host]['ansible_host'] }}
DB Port: {{ hostvars[host]['db_port'] }}
Backup Directory: {{ hostvars[host]['backup_dir'] }}
Backup Frequency: {{ hostvars[host]['backup_frequency'] | default('Not specified') }}
Backup Retention: {{ hostvars[host]['backup_retention'] | default('Not specified') }}
Environment: {{ hostvars[host]['environment'] }}
{% endfor %}
EOF
Ahora, ejecuta el playbook de informes de inventario:
cd ~/project/ansible_hostvars
ansible-playbook playbooks/inventory_report.yml
Verifica los informes generados:
cat ~/project/ansible_hostvars/output/web_servers_report.txt
cat ~/project/ansible_hostvars/output/db_servers_report.txt
Estos informes demuestran cómo se pueden usar hostvars para crear informes completos de tu infraestructura.
Manejo de Variables Faltantes
Al trabajar con hostvars, es importante manejar casos en los que las variables puedan faltar. Creemos un playbook que demuestre el acceso seguro a variables:
cat > ~/project/ansible_hostvars/playbooks/safe_variable_access.yml << 'EOF'
---
- name: Demonstrate safe variable access
hosts: all
gather_facts: no
tasks:
- name: Using default filter
debug:
msg: "The value is: {{ hostvars[inventory_hostname]['nonexistent_variable'] | default('Not defined') }}"
- name: Using conditional checks
debug:
msg: >
{% if 'special_variable' in hostvars[inventory_hostname] %}
The special variable is: {{ hostvars[inventory_hostname]['special_variable'] }}
{% else %}
The special variable is not defined for this host.
{% endif %}
EOF
Ejecuta este playbook:
cd ~/project/ansible_hostvars
ansible-playbook playbooks/safe_variable_access.yml
La salida muestra cómo manejar de forma segura las variables faltantes utilizando el filtro default y comprobaciones condicionales.
Mejores Prácticas y Aplicaciones en el Mundo Real
En este último paso, exploraremos las mejores prácticas para trabajar con hostvars y veremos algunas aplicaciones en el mundo real.
Mejores Prácticas para Organizar Variables
Organizar tus variables adecuadamente es crucial para mantener un código Ansible limpio y mantenible. Creemos una configuración de inventario más estructurada para demostrar las mejores prácticas:
mkdir -p ~/project/ansible_hostvars/inventory/group_vars/all
mkdir -p ~/project/ansible_hostvars/inventory/group_vars/webservers
mkdir -p ~/project/ansible_hostvars/inventory/group_vars/dbservers
mkdir -p ~/project/ansible_hostvars/inventory/host_vars
Ahora, creemos algunos archivos de variables organizados:
cat > ~/project/ansible_hostvars/inventory/group_vars/all/common.yml << 'EOF'
---
## Common variables for all hosts
ntp_servers:
- ntp1.example.com
- ntp2.example.com
timezone: UTC
monitoring_enabled: true
monitoring_server: monitor.example.com
EOF
cat > ~/project/ansible_hostvars/inventory/group_vars/webservers/web.yml << 'EOF'
---
## Web server specific variables
http_protocol: https
default_vhost: default.example.com
web_user: www-data
web_group: www-data
firewall_ports:
- 80
- 443
EOF
cat > ~/project/ansible_hostvars/inventory/host_vars/web01.yml << 'EOF'
---
## Host-specific variables for web01
server_role: primary
backup_server: web02
custom_vhosts:
- name: site1.example.com
docroot: /var/www/site1
- name: site2.example.com
docroot: /var/www/site2
EOF
Creemos un playbook que demuestre el acceso a estas variables estructuradas:
cat > ~/project/ansible_hostvars/playbooks/structured_vars.yml << 'EOF'
---
- name: Demonstrate structured variables
hosts: localhost
gather_facts: no
tasks:
- name: Display structured variables
debug:
msg: |
Common variables:
- NTP Servers: {{ hostvars['web01']['ntp_servers'] | default([]) }}
- Timezone: {{ hostvars['web01']['timezone'] | default('Not set') }}
Web server variables:
- HTTP Protocol: {{ hostvars['web01']['http_protocol'] | default('Not set') }}
- Default VHost: {{ hostvars['web01']['default_vhost'] | default('Not set') }}
Host-specific variables for web01:
- Server Role: {{ hostvars['web01']['server_role'] | default('Not set') }}
- Backup Server: {{ hostvars['web01']['backup_server'] | default('Not set') }}
- Custom VHosts: {{ hostvars['web01']['custom_vhosts'] | default([]) }}
EOF
Ejecuta este playbook:
cd ~/project/ansible_hostvars
ANSIBLE_INVENTORY=~/project/ansible_hostvars/inventory ansible-playbook playbooks/structured_vars.yml
Nota: Estamos utilizando la variable de entorno ANSIBLE_INVENTORY para especificar una ruta de inventario diferente para este ejemplo.
Creación de un Generador de Configuraciones
Creemos una aplicación práctica que genere archivos de configuración para múltiples servicios:
mkdir -p ~/project/ansible_hostvars/templates/configs
Crea archivos de plantilla para diferentes servicios:
cat > ~/project/ansible_hostvars/templates/configs/apache.conf.j2 << 'EOF'
## Apache configuration for {{ inventory_hostname }}
Listen {{ hostvars[inventory_hostname]['http_port'] | default(80) }}
ServerName {{ inventory_hostname }}
DocumentRoot {{ hostvars[inventory_hostname]['default_document_root'] | default('/var/www/html') }}
MaxClients {{ hostvars[inventory_hostname]['max_connections'] | default(100) }}
## Environment: {{ hostvars[inventory_hostname]['environment'] }}
EOF
cat > ~/project/ansible_hostvars/templates/configs/mysql.conf.j2 << 'EOF'
## MySQL configuration for {{ inventory_hostname }}
[mysqld]
port = {{ hostvars[inventory_hostname]['db_port'] | default(3306) }}
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
max_connections = {{ hostvars[inventory_hostname]['max_connections'] | default(100) }}
## Backup directory: {{ hostvars[inventory_hostname]['backup_dir'] | default('/var/backups') }}
## Environment: {{ hostvars[inventory_hostname]['environment'] }}
EOF
cat > ~/project/ansible_hostvars/templates/configs/postgresql.conf.j2 << 'EOF'
## PostgreSQL configuration for {{ inventory_hostname }}
listen_addresses = '*'
port = {{ hostvars[inventory_hostname]['db_port'] | default(5432) }}
max_connections = {{ hostvars[inventory_hostname]['max_connections'] | default(100) }}
## Backup directory: {{ hostvars[inventory_hostname]['backup_dir'] | default('/var/backups') }}
## Environment: {{ hostvars[inventory_hostname]['environment'] }}
EOF
Ahora, crea un playbook para aplicar estas plantillas:
cat > ~/project/ansible_hostvars/playbooks/config_generator.yml << 'EOF'
---
- name: Generate service configurations
hosts: all
gather_facts: no
tasks:
- name: Create output directory
file:
path: ~/project/ansible_hostvars/output/configs/{{ inventory_hostname }}
state: directory
- name: Generate Apache configuration for web servers
template:
src: ../templates/configs/apache.conf.j2
dest: ~/project/ansible_hostvars/output/configs/{{ inventory_hostname }}/apache.conf
when: inventory_hostname in groups['webservers']
- name: Generate MySQL configuration for database servers with MySQL
template:
src: ../templates/configs/mysql.conf.j2
dest: ~/project/ansible_hostvars/output/configs/{{ inventory_hostname }}/mysql.conf
when: inventory_hostname in groups['dbservers'] and hostvars[inventory_hostname]['db_port'] | string == '3306'
- name: Generate PostgreSQL configuration for database servers with PostgreSQL
template:
src: ../templates/configs/postgresql.conf.j2
dest: ~/project/ansible_hostvars/output/configs/{{ inventory_hostname }}/postgresql.conf
when: inventory_hostname in groups['dbservers'] and hostvars[inventory_hostname]['db_port'] | string == '5432'
EOF
Ejecuta el playbook del generador de configuraciones:
cd ~/project/ansible_hostvars
ansible-playbook playbooks/config_generator.yml
Explora los archivos de configuración generados:
find ~/project/ansible_hostvars/output/configs -type f | sort
Visualiza algunas de las configuraciones generadas:
cat ~/project/ansible_hostvars/output/configs/web01/apache.conf
cat ~/project/ansible_hostvars/output/configs/db01/mysql.conf
cat ~/project/ansible_hostvars/output/configs/db02/postgresql.conf
Creación de una Herramienta de Documentación de Hosts
Finalmente, creemos una herramienta que genere documentación completa para cada host en nuestro inventario:
cat > ~/project/ansible_hostvars/templates/host_doc.j2 << 'EOF'
## Host Documentation for {{ inventory_hostname }}
==============================================
### Basic Information
- Hostname: {{ inventory_hostname }}
- IP Address: {{ hostvars[inventory_hostname]['ansible_host'] }}
- Environment: {{ hostvars[inventory_hostname]['environment'] | default('Not specified') }}
### Role Information
{% if inventory_hostname in groups['webservers'] %}
- Role: Web Server
- HTTP Port: {{ hostvars[inventory_hostname]['http_port'] | default('Not specified') }}
- Max Connections: {{ hostvars[inventory_hostname]['max_connections'] | default('Not specified') }}
{% if 'web_server_type' in hostvars[inventory_hostname] %}
- Web Server Type: {{ hostvars[inventory_hostname]['web_server_type'] }}
{% endif %}
{% endif %}
{% if inventory_hostname in groups['dbservers'] %}
- Role: Database Server
- DB Port: {{ hostvars[inventory_hostname]['db_port'] | default('Not specified') }}
- Backup Directory: {{ hostvars[inventory_hostname]['backup_dir'] | default('Not specified') }}
{% if 'backup_frequency' in hostvars[inventory_hostname] %}
- Backup Frequency: {{ hostvars[inventory_hostname]['backup_frequency'] }}
- Backup Retention: {{ hostvars[inventory_hostname]['backup_retention'] }} days
{% endif %}
{% endif %}
### Related Hosts
{% if inventory_hostname in groups['webservers'] %}
#### Database Servers:
{% for db_host in groups['dbservers'] %}
- {{ db_host }} ({{ hostvars[db_host]['ansible_host'] }})
{% endfor %}
{% endif %}
{% if inventory_hostname in groups['dbservers'] %}
#### Web Servers:
{% for web_host in groups['webservers'] %}
- {{ web_host }} ({{ hostvars[web_host]['ansible_host'] }})
{% endfor %}
{% endif %}
EOF
Crea un playbook para generar la documentación:
cat > ~/project/ansible_hostvars/playbooks/host_documentation.yml << 'EOF'
---
- name: Generate host documentation
hosts: all
gather_facts: no
tasks:
- name: Create output directory
file:
path: ~/project/ansible_hostvars/output/docs
state: directory
- name: Generate host documentation
template:
src: ../templates/host_doc.j2
dest: ~/project/ansible_hostvars/output/docs/{{ inventory_hostname }}.md
EOF
Ejecuta el playbook de documentación:
cd ~/project/ansible_hostvars
ansible-playbook playbooks/host_documentation.yml
Visualiza la documentación generada:
ls -l ~/project/ansible_hostvars/output/docs/
cat ~/project/ansible_hostvars/output/docs/web01.md
cat ~/project/ansible_hostvars/output/docs/db01.md
¡Felicidades! Ahora has completado una exploración exhaustiva de hostvars en Ansible, desde el uso básico hasta aplicaciones avanzadas. Has aprendido a acceder a las variables de host, utilizarlas en plantillas y crear herramientas prácticas para gestionar tu infraestructura.
Resumen
En este laboratorio, exploraste el poder y la versatilidad de los hostvars de Ansible. Esto es lo que aprendiste:
Configuración del Entorno: Configuraste un entorno Ansible con una estructura de inventario que incluía hosts, grupos y variables.
Exploración de Hostvars: Aprendiste a acceder a los
hostvarsen los playbooks, incluyendo el acceso a variables del host actual y de otros hosts en el inventario.Uso de Hostvars en Plantillas: Creaste plantillas Jinja2 que aprovechan los
hostvarspara generar archivos de configuración dinámicos adaptados a cada host.Técnicas Avanzadas de Hostvars: Exploraste variables de grupo, informes de inventario dinámicos y técnicas para manejar variables faltantes de forma segura.
Mejores Prácticas y Aplicaciones en el Mundo Real: Implementaste una organización estructurada de variables y creaste aplicaciones prácticas, incluyendo un generador de configuraciones y una herramienta de documentación de hosts.
Los hostvars de Ansible son una característica potente que te permite crear flujos de trabajo de automatización dinámicos y adaptables. Al comprender cómo trabajar eficazmente con hostvars, puedes crear soluciones de automatización más flexibles y mantenibles para tu infraestructura.
A medida que continúas tu viaje con Ansible, recuerda que los hostvars son solo una parte del rico ecosistema de características de Ansible. Considera explorar otras características como roles, colecciones e inventarios dinámicos para mejorar aún más tus capacidades de automatización.


