Depurar problemas de precedencia de variables

AnsibleBeginner
Practicar Ahora

Introducción

Cuando una misma variable se define en varios lugares, Ansible aplica reglas de precedencia. Depurar el valor final es esencial antes de realizar cambios en un playbook.

En este laboratorio, definirá las mismas variables en los niveles all, group, host y extra-var, y luego generará informes que demuestren qué nivel tiene prioridad.

Crear un proyecto de práctica de precedencia

En este paso, creará un proyecto con directorios para variables de tipo all, group y host.

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

Este laboratorio define intencionalmente la misma variable en varios lugares. Los informes mostrarán el valor final que selecciona Ansible, en lugar de pedirle que infiera la precedencia únicamente a partir de los nombres de los archivos.

Definir variables de tipo All y Group

En este paso, definirá valores base en group_vars/all.yml y luego los sobrescribirá para el 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/all.yml <<'EOF'
app_port: 8000
app_source: all
EOF
cat > inventory/group_vars/web.yml <<'EOF'
app_port: 8080
app_source: group
EOF

group_vars/all.yml se aplica a todos los hosts, mientras que group_vars/web.yml se aplica solo al grupo web. Dado que web1 y web2 son hosts web, los valores del grupo deberían sobrescribir la configuración base de todos los hosts.

cat inventory/group_vars/all.yml inventory/group_vars/web.yml

Definir una sobrescritura de variable de host

En este paso, sobrescribirá las mismas variables solo para web2. Las variables de host son más específicas 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'
app_port: 9090
app_source: host
EOF

Este archivo se aplica solo a web2, por lo que debería sobrescribir los valores del grupo web para ese host. web1 debería seguir utilizando los valores del grupo.

ansible-inventory --host web2

Utilice la salida del inventario para confirmar el valor resuelto antes de ejecutar un playbook. Debería mostrar app_port como 9090 para web2.

Generar los valores de variables resueltos

En este paso, escribirá y ejecutará un playbook que registra los valores finales que Ansible eligió para cada host. Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible.

cd /home/labex/project/rhce-ansible
cat > playbooks/show-precedence.yml <<'EOF'
---
- name: Show resolved variable precedence
  hosts: web
  gather_facts: false
  tasks:
    - name: Write resolved variable report
      ansible.builtin.copy:
        dest: "/home/labex/project/rhce-ansible/reports/{{ inventory_hostname }}.txt"
        content: |
          host={{ inventory_hostname }}
          app_port={{ app_port }}
          app_source={{ app_source }}
        mode: '0644'
EOF

El playbook escribe los valores finales resueltos en archivos. Esto hace que la precedencia sea visible: cada informe registra tanto el puerto elegido como una etiqueta de origen que le indica qué capa prevaleció.

ansible-playbook playbooks/show-precedence.yml | tee reports/normal-run.txt
cat reports/web1.txt reports/web2.txt

web1 debería mostrar app_source=group, y web2 debería mostrar app_source=host. Esto demuestra que las variables de host son más específicas que las variables de grupo.

Sobrescribir con variables extra

En este paso, pasará variables extra con -e. Las variables extra tienen una precedencia muy alta y sobrescriben tanto las variables de grupo como las de host para esta ejecución. Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible.

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/show-precedence.yml -e app_port=10080 -e app_source=extra | tee reports/extra-run.txt

Las variables extra son intencionalmente poderosas. Sobrescriben tanto las variables de grupo como las de host para esta ejecución, pero no modifican los archivos de variables en el disco.

cat reports/web1.txt reports/web2.txt

Ambos informes deberían mostrar ahora los valores de las variables extra. Si solo cambió un host, verifique cómo se escribieron las opciones -e.

Resumen

Comparó variables de tipo all, group, host y extra, y luego utilizó informes generados para demostrar qué valor aplicó Ansible en cada nivel de precedencia.