Crear inventarios estáticos con grupos y variables

AnsibleBeginner
Practicar Ahora

Introducción

Los inventarios describen los hosts que Ansible puede gestionar y los grupos a los que pertenecen dichos hosts. Una buena estructura de inventario le permite segmentar los hosts con claridad y asignar variables en el ámbito adecuado.

En este laboratorio, creará un inventario estático con alias de host, grupos, grupos secundarios, variables de grupo, variables de host y un breve playbook que demuestra que las variables se resuelven según lo esperado.

Crear un proyecto de inventario

En este paso, creará los directorios del proyecto utilizados para practicar con el inventario. Este laboratorio utiliza alias de host locales para que pueda aprender el comportamiento del inventario de forma segura dentro de una única máquina virtual RHEL 10.

Cree el proyecto y acceda a él.

cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,inventory/host_vars,playbooks,reports}
cd rhce-ansible

Cree el archivo ansible.cfg para que Ansible utilice su inventario de forma predeterminada.

cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
retry_files_enabled = False
interpreter_python = auto_silent
EOF

Este laboratorio coloca los archivos de variables en inventory/group_vars e inventory/host_vars. Esta estructura mantiene los datos del inventario organizados y deja claro que las variables pertenecen a los hosts definidos en inventory/hosts.

Definir hosts, grupos y grupos secundarios

En este paso, creará un inventario estático. Cada alias de host utiliza ansible_connection=local, por lo que los alias se comportan como hosts gestionados mientras los comandos se ejecutan en esta misma máquina virtual. Los grupos secundarios permiten que un grupo contenga a otros grupos.

Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible. Esto mantiene la estabilidad de los comandos incluso cuando LabEx ejecuta cada paso por separado.

cd /home/labex/project/rhce-ansible

Cree el archivo inventory/hosts.

cat > inventory/hosts <<'EOF'
[web]
web1 ansible_connection=local
web2 ansible_connection=local

[db]
db1 ansible_connection=local

[prod:children]
web
db
EOF

Inspeccione el gráfico de grupos.

ansible-inventory --graph

Las secciones web y db definen grupos ordinarios. La sección [prod:children] define un grupo principal, por lo que el gráfico debería mostrar que prod contiene ambos grupos y los tres alias de host.

Agregar variables de grupo y de host

En este paso, asignará variables a grupos y a hosts individuales. Una variable de grupo se aplica a todos los hosts de ese grupo. Una variable de host sobrescribe o complementa los valores para un host específico.

Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible.

cd /home/labex/project/rhce-ansible

Cree variables para los hosts web.

cat > inventory/group_vars/web.yml <<'EOF'
service_role: web
service_port: 8080
EOF

Estos valores se aplican a todos los hosts del grupo web. En este inventario, tanto web1 como web2 deberían heredar el rol web y el puerto.

Cree variables para los hosts de base de datos.

cat > inventory/group_vars/db.yml <<'EOF'
service_role: database
service_port: 5432
EOF

El grupo de base de datos obtiene valores diferentes porque los hosts de base de datos suelen requerir configuraciones de servicio distintas. Separar los archivos de grupo evita tener que incluir condicionales en cada tarea del playbook.

Cree una variable específica para el host web2.

cat > inventory/host_vars/web2.yml <<'EOF'
rack: rack-b
EOF

Las variables de host tienen el ámbito más restringido utilizado en este laboratorio. Solo web2 debería tener el valor rack, lo que facilita observar la diferencia entre los datos a nivel de grupo y los datos específicos de un host.

Inspeccionar las variables de host resueltas

En este paso, le pedirá a Ansible que muestre las variables resueltas para hosts seleccionados. Esta es una forma segura de depurar el inventario antes de escribir playbooks.

Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible.

cd /home/labex/project/rhce-ansible

Inspeccione web1.

ansible-inventory --host web1

web1 debería mostrar el rol web y el puerto, pero ninguna variable rack. Esa ausencia es una prueba útil de que el archivo específico del host para web2 no se aplicó accidentalmente a todo el grupo.

Inspeccione web2 y busque el valor rack específico del host.

ansible-inventory --host web2 | grep -E 'service_role|service_port|rack'

Inspeccione db1.

ansible-inventory --host db1 | grep -E 'service_role|service_port'

Compare los tres hosts antes de escribir el playbook. Este es el flujo de trabajo normal para depurar inventarios: confirme primero los valores heredados del grupo y, a continuación, verifique si existe algún valor específico para el host.

Escribir un playbook de informe de variables

En este paso, creará un breve playbook que escribe un archivo de informe por cada host del inventario. La tarea utiliza inventory_hostname para que cada alias obtenga su propio archivo, aunque todos los alias se ejecuten localmente.

Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible.

cd /home/labex/project/rhce-ansible

Cree el playbook.

cat > playbooks/write-inventory-report.yml <<'EOF'
---
- name: Write inventory variable reports
  hosts: prod
  gather_facts: false
  tasks:
    - name: Write report for each inventory host
      ansible.builtin.copy:
        dest: "/home/labex/project/rhce-ansible/reports/{{ inventory_hostname }}.txt"
        content: "{{ inventory_hostname }} role={{ service_role }} port={{ service_port }} rack={{ rack | default('none') }}\n"
        mode: '0644'
EOF

La expresión {{ inventory_hostname }} se expande al alias del host actual, por lo que una sola tarea puede crear archivos de informe separados para web1, web2 y db1. El filtro default('none') evita errores en los hosts que no definen rack.

Ejecute el playbook e inspeccione los informes.

ansible-playbook playbooks/write-inventory-report.yml

El play apunta a prod, que es el grupo principal que contiene tanto los hosts web como los de base de datos. El resumen debería incluir los tres alias y finalizar con failed=0.

cat reports/*.txt

Los archivos de informe son la prueba definitiva de que las variables del inventario se resolvieron correctamente. web2.txt debería incluir rack-b, mientras que los otros hosts deberían mostrar rack=none.

Resumen

Ha construido un inventario estático con grupos, grupos secundarios, variables de grupo y variables de host. También ha validado la resolución de variables con ansible-inventory y un pequeño playbook.