Ansible Hostvars

AnsibleBeginner
Practicar Ahora

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.

Este es un Laboratorio Guiado (Guided Lab), que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel avanzado con una tasa de finalización del 50%. Ha recibido una tasa de revisión positiva del 100% por parte de los estudiantes.

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: webservers y dbservers.
  • Cada host tiene variables específicas como http_port o db_port.
  • Hemos establecido variables globales para todos los hosts bajo [all:vars].
  • Estamos utilizando ansible_connection=local ya 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:

  1. Configuración del Entorno: Configuraste un entorno Ansible con una estructura de inventario que incluía hosts, grupos y variables.

  2. Exploración de Hostvars: Aprendiste a acceder a los hostvars en los playbooks, incluyendo el acceso a variables del host actual y de otros hosts en el inventario.

  3. Uso de Hostvars en Plantillas: Creaste plantillas Jinja2 que aprovechan los hostvars para generar archivos de configuración dinámicos adaptados a cada host.

  4. Técnicas Avanzadas de Hostvars: Exploraste variables de grupo, informes de inventario dinámicos y técnicas para manejar variables faltantes de forma segura.

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