# Résumé : Filtrage des Playbooks par Host/Group ## ✅ Implémentation Complétée Le système de filtrage des playbooks basé sur le champ `hosts` a été entièrement implémenté et testé. ## 🎯 Objectif Assurer que seuls les playbooks compatibles avec un hôte ou groupe spécifique peuvent être exécutés, en se basant sur le champ `hosts` défini dans chaque playbook Ansible. ## 📋 Exemple Concret ### Playbook `backup-proxmox-config.yml` ```yaml --- - name: Backup Serveurs Proxmox Configuration files hosts: role_proxmox # ← Restriction au groupe role_proxmox become: true # ... ``` **Résultat :** - ✅ **Peut être exécuté sur :** - Groupe `role_proxmox` - Hôtes membres : `ali2v.xeon.home`, `hp.nas.home`, `hp2.i7.home`, etc. - ❌ **Ne peut PAS être exécuté sur :** - Hôte `raspi.4gb.home` (membre de `role_sbc`, pas de `role_proxmox`) - Groupe `env_homelab` (contient des hôtes hors de `role_proxmox`) ## 🔧 Modifications Apportées ### 1. Extraction du Champ `hosts` **Fichier :** `app/app_optimized.py` La méthode `AnsibleService.get_playbooks()` extrait maintenant le champ `hosts` de chaque playbook : ```python playbook_info = { "name": pb.stem, "filename": pb.name, "hosts": "all", # Valeur par défaut "category": "general", "subcategory": "other", # ... } # Lecture du champ 'hosts' depuis le YAML if 'hosts' in play: playbook_info['hosts'] = play['hosts'] ``` ### 2. Fonction de Compatibilité **Nouvelle méthode :** `is_target_compatible_with_playbook(target, playbook_hosts)` Vérifie la compatibilité selon les règles : - `hosts: all` → compatible avec tout - `hosts: role_proxmox` → compatible avec le groupe et ses hôtes - `hosts: server.home` → compatible uniquement avec cet hôte ### 3. Filtrage des Playbooks **Nouvelle méthode :** `get_compatible_playbooks(target)` Retourne uniquement les playbooks compatibles avec une cible donnée. ### 4. Endpoint de Listing Amélioré **Endpoint :** `GET /api/ansible/playbooks?target={host_ou_groupe}` ```bash # Sans filtre - tous les playbooks curl http://localhost:8000/api/ansible/playbooks # Avec filtre - seulement les playbooks compatibles avec role_proxmox curl http://localhost:8000/api/ansible/playbooks?target=role_proxmox ``` ### 5. Validation à l'Exécution **Endpoint :** `POST /api/ansible/execute` Validation automatique avant l'exécution : ```json { "playbook": "backup-proxmox-config.yml", "target": "raspi.4gb.home" // ❌ Erreur 400 - incompatible } ``` **Message d'erreur :** ``` Le playbook 'backup-proxmox-config.yml' (hosts: role_proxmox) n'est pas compatible avec la cible 'raspi.4gb.home'. Ce playbook ne peut être exécuté que sur: role_proxmox ``` ### 6. Validation des Schedules **Endpoint :** `POST /api/schedules` Même validation lors de la création de tâches planifiées. ## 🧪 Tests **Script de test :** `test_playbook_filtering.py` ```bash python test_playbook_filtering.py ``` **Résultats :** ``` ✓ PASS | Playbook Proxmox sur groupe role_proxmox ✓ PASS | Playbook Proxmox sur hôte du groupe role_proxmox ✓ PASS | Playbook Proxmox sur hôte hors groupe role_proxmox ✓ PASS | Playbook Proxmox sur groupe env_homelab ✓ PASS | Playbook 'all' sur groupe all ✓ PASS | Playbook 'all' sur n'importe quel groupe ✓ PASS | Playbook 'all' sur n'importe quel hôte ✓ PASS | Playbook 'all' sur hôte quelconque Tests terminés! (8/8 réussis) ``` ## 📊 Inventaire Actuel ### Groupes et Hôtes **Groupe `role_proxmox` :** - `ali2v.xeon.home` - `hp.nas.home` - `hp2.i7.home` - `hp3.i5.home` - `mimi.pc.home` **Groupe `role_sbc` :** - `orangepi.pc.home` - `raspi.4gb.home` - `raspi.8gb.home` ### Playbooks | Playbook | Champ `hosts` | Description | |----------|---------------|-------------| | `backup-proxmox-config.yml` | `role_proxmox` | Backup configuration Proxmox | | `bootstrap-host.yml` | `all` | Bootstrap initial d'un hôte | | `health-check.yml` | `all` | Vérification de santé | | `vm-upgrade.yml` | `all` | Mise à jour des packages | | `vm-reboot.yml` | `all` | Redémarrage | ## 🎨 Utilisation dans l'Interface ### Scénario 1 : Sélection d'un Hôte Proxmox 1. Utilisateur sélectionne `ali2v.xeon.home` 2. Interface appelle : `GET /api/ansible/playbooks?target=ali2v.xeon.home` 3. Playbooks affichés : - ✅ `backup-proxmox-config.yml` (compatible via role_proxmox) - ✅ `health-check.yml` (compatible via all) - ✅ `vm-upgrade.yml` (compatible via all) - etc. ### Scénario 2 : Sélection d'un Hôte SBC 1. Utilisateur sélectionne `raspi.4gb.home` 2. Interface appelle : `GET /api/ansible/playbooks?target=raspi.4gb.home` 3. Playbooks affichés : - ❌ `backup-proxmox-config.yml` (NON affiché - incompatible) - ✅ `health-check.yml` (compatible via all) - ✅ `vm-upgrade.yml` (compatible via all) - etc. ### Scénario 3 : Tentative d'Exécution Incompatible 1. Utilisateur essaie d'exécuter `backup-proxmox-config.yml` sur `raspi.4gb.home` 2. API retourne erreur 400 avec message explicatif 3. Interface affiche le message d'erreur à l'utilisateur ## 📝 Bonnes Pratiques ### Pour les Nouveaux Playbooks Toujours définir explicitement le champ `hosts` : ```yaml --- - name: Mon nouveau playbook hosts: role_proxmox # ← Spécifier le groupe cible become: true vars: category: maintenance subcategory: system tasks: # ... ``` ### Pour les Playbooks Universels Utiliser `hosts: all` pour les playbooks qui peuvent s'exécuter partout : ```yaml --- - name: Health check hosts: all # ← Compatible avec tous les hôtes become: false # ... ``` ## 🔍 Dépannage ### Problème : Playbook non visible pour un hôte **Vérifier :** 1. Le champ `hosts` dans le playbook 2. L'appartenance de l'hôte aux groupes dans `ansible/inventory/hosts.yml` **Exemple :** ```bash # Voir les playbooks compatibles avec un hôte curl http://localhost:8000/api/ansible/playbooks?target=ali2v.xeon.home ``` ### Problème : Erreur lors de l'exécution **Message :** "Le playbook X n'est pas compatible avec la cible Y" **Solution :** - Utiliser le filtrage pour voir les playbooks compatibles - Choisir un playbook compatible ou changer la cible ## 📚 Documentation - **Documentation complète :** `PLAYBOOK_FILTERING.md` - **Script de test :** `test_playbook_filtering.py` - **Code source :** `app/app_optimized.py` (classe `AnsibleService`) ## ✨ Résumé des Bénéfices 1. ✅ **Sécurité** : Empêche l'exécution de playbooks sur des hôtes incompatibles 2. ✅ **Clarté** : Messages d'erreur explicites en cas d'incompatibilité 3. ✅ **Filtrage** : Interface peut afficher uniquement les playbooks pertinents 4. ✅ **Validation** : Contrôles à tous les niveaux (listing, exécution, schedules) 5. ✅ **Flexibilité** : Support de `all`, groupes, hôtes, et sous-groupes ## 🚀 Prochaines Étapes L'implémentation est complète et testée. L'interface peut maintenant : 1. Appeler `/api/ansible/playbooks?target=X` pour filtrer les playbooks 2. Afficher uniquement les playbooks compatibles dans les listes déroulantes 3. Gérer les erreurs de compatibilité avec des messages clairs 4. Créer des schedules avec validation automatique --- **Date :** 5 décembre 2024 **Statut :** ✅ Implémentation complétée et testée **Tests :** 8/8 réussis