Construire des inventaires statiques avec des groupes et des variables

AnsibleBeginner
Pratiquer maintenant

Introduction

Les inventaires décrivent les hôtes qu'Ansible peut gérer ainsi que les groupes auxquels ces hôtes appartiennent. Une structure d'inventaire bien pensée vous permet de cibler les hôtes avec précision et d'associer des variables à la portée appropriée.

Dans ce laboratoire, vous allez construire un inventaire statique comprenant des alias d'hôtes, des groupes, des groupes enfants, des variables de groupe, des variables d'hôte, ainsi qu'un court playbook permettant de vérifier que les variables sont résolues comme prévu.

Créer un projet d'inventaire

Dans cette étape, vous allez créer les répertoires du projet utilisés pour la pratique de l'inventaire. Ce laboratoire utilise des alias d'hôtes locaux afin que vous puissiez apprendre le comportement de l'inventaire en toute sécurité au sein d'une seule machine virtuelle RHEL 10.

Créez le projet et accédez-y.

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

Créez le fichier ansible.cfg afin qu'Ansible utilise votre inventaire par défaut.

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

Ce laboratoire place les fichiers de variables sous inventory/group_vars et inventory/host_vars. Cette disposition permet de regrouper les données d'inventaire et indique clairement que les variables appartiennent aux hôtes définis dans inventory/hosts.

Définir des hôtes, des groupes et des groupes enfants

Dans cette étape, vous allez créer un inventaire statique. Chaque alias d'hôte utilise ansible_connection=local, de sorte que les alias se comportent comme des hôtes gérés tout en exécutant les commandes sur cette machine virtuelle. Les groupes enfants permettent à un groupe de contenir d'autres groupes.

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

Créez 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

Inspectez le graphe des groupes.

ansible-inventory --graph

Les sections web et db définissent des groupes ordinaires. La section [prod:children] définit un groupe parent ; le graphe devrait donc montrer que prod contient les deux groupes ainsi que les trois alias d'hôtes.

Ajouter des variables de groupe et d'hôte

Dans cette étape, vous allez associer des variables à des groupes et à des hôtes individuels. Une variable de groupe s'applique à tous les hôtes de ce groupe. Une variable d'hôte remplace ou complète les valeurs pour un hôte spécifique.

Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet Ansible.

cd /home/labex/project/rhce-ansible

Créez des variables pour les hôtes web.

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

Ces valeurs s'appliquent à chaque hôte du groupe web. Dans cet inventaire, web1 et web2 devraient hériter du rôle web et du port.

Créez des variables pour les hôtes de base de données.

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

Le groupe de base de données reçoit des valeurs différentes car les hôtes de base de données nécessitent généralement des paramètres de service distincts. Séparer les fichiers de groupe évite d'insérer des conditions dans chaque tâche du playbook.

Créez une variable spécifique à l'hôte pour web2.

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

Les variables d'hôte constituent la portée la plus restreinte utilisée dans ce laboratoire. Seul web2 devrait posséder la valeur rack, ce qui permet de distinguer facilement les données globales au groupe des données spécifiques à un hôte.

Inspecter les variables d'hôte résolues

Dans cette étape, vous allez demander à Ansible d'afficher les variables résolues pour des hôtes sélectionnés. C'est un moyen sûr de déboguer l'inventaire avant d'écrire des playbooks.

Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet Ansible.

cd /home/labex/project/rhce-ansible

Inspectez web1.

ansible-inventory --host web1

web1 devrait afficher le rôle web et le port, mais aucune variable rack. Cette absence est une preuve utile que le fichier spécifique à l'hôte web2 ne s'est pas appliqué par erreur à l'ensemble du groupe.

Inspectez web2 et recherchez la valeur rack spécifique à l'hôte.

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

Inspectez db1.

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

Comparez les trois hôtes avant d'écrire le playbook. C'est le flux de travail habituel pour le débogage d'inventaire : confirmez d'abord les valeurs héritées du groupe, puis vérifiez si une valeur spécifique à l'hôte existe.

Écrire un playbook de rapport de variables

Dans cette étape, vous allez créer un court playbook qui génère un fichier de rapport par hôte d'inventaire. La tâche utilise inventory_hostname afin que chaque alias obtienne son propre fichier, même si tous les alias s'exécutent localement.

Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet Ansible.

cd /home/labex/project/rhce-ansible

Créez le 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

L'expression {{ inventory_hostname }} est remplacée par l'alias de l'hôte actuel, permettant à une seule tâche de créer des fichiers de rapport distincts pour web1, web2 et db1. Le filtre default('none') évite une erreur sur les hôtes qui ne définissent pas rack.

Exécutez le playbook et inspectez les rapports.

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

Le play cible prod, qui est le groupe parent contenant à la fois les hôtes web et base de données. Le récapitulatif doit inclure les trois alias et se terminer par failed=0.

cat reports/*.txt

Les fichiers de rapport sont la preuve finale que les variables d'inventaire ont été correctement résolues. web2.txt devrait inclure rack-b, tandis que les autres hôtes devraient afficher rack=none.

Résumé

Vous avez construit un inventaire statique avec des groupes, des groupes enfants, des variables de groupe et des variables d'hôte. Vous avez également validé la résolution des variables avec ansible-inventory et un petit playbook.