Gestionar variables de grupo, de host y hechos (facts)

AnsibleBeginner
Practicar Ahora

Introducción

Las variables le permiten mantener los datos fuera de la lógica de las tareas. Las variables de grupo proporcionan valores compartidos, las variables de host sobrescriben los valores de hosts individuales y los hechos (facts) añaden datos descubiertos del sistema.

En este laboratorio, definirá variables de grupo y de host, recopilará hechos de RHEL y generará un informe por cada alias de host.

Crear un proyecto de práctica de variables

En este paso, creará un proyecto con alias de hosts web y directorios de variables.

cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,inventory/host_vars,playbooks,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[web]
web1 ansible_connection=local
web2 ansible_connection=local
EOF

Ambos hosts son alias locales, pero Ansible resuelve las variables por separado para cada nombre de inventario. Esto le permite practicar sobrescrituras específicas de host sin necesidad de máquinas virtuales adicionales.

Establecer variables de grupo compartidas

En este paso, definirá valores que se aplican a todos los hosts del grupo web. 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
cat > inventory/group_vars/web.yml <<'EOF'
service_name: demo-web
service_port: 8080
EOF

Estos valores se aplican a todos los hosts del grupo web. En este punto, tanto web1 como web2 utilizarían el puerto 8080.

cat inventory/group_vars/web.yml

Sobrescribir una variable de host

En este paso, sobrescribirá service_port solo para web2. Las variables de host tienen mayor prioridad que las variables de grupo. Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible.

cd /home/labex/project/rhce-ansible
cat > inventory/host_vars/web2.yml <<'EOF'
service_port: 9090
EOF

Este archivo es más específico que group_vars/web.yml, por lo que solo web2 debería usar 9090. web1 debería seguir usando el valor del grupo.

ansible-inventory --host web2

Inspeccione la salida del host resuelto y busque service_port. Este comando muestra el valor final que Ansible utilizará antes de que se ejecute cualquier playbook.

Escribir un playbook de informe basado en hechos

En este paso, escribirá un playbook que combine variables de inventario con hechos recopilados. El hecho ansible_distribution_major_version proviene del host gestionado. Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible.

cd /home/labex/project/rhce-ansible
cat > playbooks/report-vars.yml <<'EOF'
---
- name: Render variable and fact reports
  hosts: web
  gather_facts: true
  tasks:
    - name: Write per-host variable report
      ansible.builtin.copy:
        dest: "/home/labex/project/rhce-ansible/reports/{{ inventory_hostname }}.txt"
        content: |
          host={{ inventory_hostname }}
          service={{ service_name }}
          port={{ service_port }}
          rhel_major={{ ansible_distribution_major_version }}
        mode: '0644'
EOF

El informe combina dos fuentes de datos: variables de inventario como service_port y hechos recopilados como ansible_distribution_major_version. Este es un patrón común cuando la configuración depende tanto de la intención declarada como de los detalles descubiertos del sistema.

ansible-playbook playbooks/report-vars.yml --syntax-check

Ejecutar el informe de variables

En este paso, ejecutará el playbook y comparará los informes. Los valores compartidos deben coincidir, mientras que el puerto debe ser diferente para web2. Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible.

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/report-vars.yml | tee reports/report-run.txt

La ejecución debe recopilar los hechos primero y luego escribir un informe para cada host. Un resumen exitoso con failed=0 significa que ambos alias de host generaron sus informes.

cat reports/web1.txt reports/web2.txt

Compare las líneas port=: web1 debería mostrar 8080, mientras que web2 debería mostrar 9090. El valor compartido service= debería coincidir en ambos informes.

Resumen

Ha definido variables de grupo, sobrescrito un valor con variables de host, recopilado hechos y generado informes que demuestran cómo Ansible resolvió cada valor.