Introduction
Lorsqu'une même variable est définie à plusieurs endroits, Ansible applique des règles de priorité. Il est essentiel de déboguer la valeur finale avant de modifier un playbook.
Dans ce laboratoire, vous définirez les mêmes variables aux niveaux all, group, host et extra-var, puis vous générerez des rapports pour démontrer quel niveau l'emporte.
Créer un projet de pratique sur la priorité
Dans cette étape, vous allez créer un projet contenant les répertoires de variables all, group et 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
Ce laboratoire définit intentionnellement la même variable à plusieurs endroits. Les rapports montreront la valeur finale sélectionnée par Ansible, plutôt que de vous demander de déduire la priorité uniquement à partir des noms de fichiers.
Définir les variables All et Group
Dans cette étape, vous définirez des valeurs de base dans group_vars/all.yml, puis vous les remplacerez pour le groupe web.
Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet Ansible. Cela garantit la stabilité des commandes, même si LabEx exécute chaque étape séparément.
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 s'applique à tous les hôtes, tandis que group_vars/web.yml ne s'applique qu'au groupe web. Comme web1 et web2 sont tous deux des hôtes web, les valeurs du groupe doivent remplacer la base de référence all-host.
cat inventory/group_vars/all.yml inventory/group_vars/web.yml
Définir une substitution de variable d'hôte
Dans cette étape, vous allez remplacer les mêmes variables uniquement pour web2. Les variables d'hôte sont plus spécifiques que les variables de groupe.
Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet Ansible.
cd /home/labex/project/rhce-ansible
cat > inventory/host_vars/web2.yml <<'EOF'
app_port: 9090
app_source: host
EOF
Ce fichier ne s'applique qu'à web2, il doit donc remplacer les valeurs du groupe web pour cet hôte. web1 doit continuer à utiliser les valeurs du groupe.
ansible-inventory --host web2
Utilisez la sortie de l'inventaire pour confirmer la valeur résolue avant d'exécuter un playbook. Elle devrait indiquer app_port comme étant 9090 pour web2.
Rendre les valeurs de variables résolues
Dans cette étape, vous allez écrire et exécuter un playbook qui enregistre les valeurs finales choisies par Ansible pour chaque hôte. Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet 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
Le playbook écrit les valeurs finales résolues dans des fichiers. Cela rend la priorité visible : chaque rapport enregistre à la fois le port choisi et une étiquette de source qui vous indique quel niveau a gagné.
ansible-playbook playbooks/show-precedence.yml | tee reports/normal-run.txt
cat reports/web1.txt reports/web2.txt
web1 devrait afficher app_source=group, et web2 devrait afficher app_source=host. Cela prouve que les variables d'hôte sont plus spécifiques que les variables de groupe.
Remplacer par des variables supplémentaires (Extra Variables)
Dans cette étape, vous allez transmettre des variables supplémentaires avec -e. Les variables supplémentaires ont une priorité très élevée et remplacent à la fois les variables de groupe et d'hôte pour cette exécution.
Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet 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
Les variables supplémentaires sont intentionnellement puissantes. Elles remplacent à la fois les variables de groupe et d'hôte pour cette exécution, mais elles ne modifient pas les fichiers de variables sur le disque.
cat reports/web1.txt reports/web2.txt
Les deux rapports devraient maintenant afficher les valeurs des variables supplémentaires. Si un seul hôte a changé, vérifiez à nouveau la saisie des options -e.
Résumé
Vous avez comparé les variables all, group, host et extra, puis utilisé des rapports générés pour prouver quelle valeur Ansible a appliquée à chaque niveau de priorité.


