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.


