# Le GUI (console d'exploitation) > **Unité d'apprentissage.** Moule : ① concept → ② Set-OPS → ③ transférable → ④ à toi de jouer. --- ## ① Le concept *(générique)* Un moteur d'infrastructure a besoin d'une **interface humaine** — sinon il n'est utilisable que par son auteur (ou une IA). Le principe fondateur : **un opérateur doit tout piloter seul**, sans l'auteur et sans IA (« exploitable sans IA »). Une bonne console d'exploitation obéit à trois règles : - **Elle édite la SOURCE, pas l'artefact.** On modifie le *plan* (l'état voulu), jamais l'inventaire généré. La console montre la vérité, elle ne la contourne pas. - **Elle prévisualise avant d'agir.** *dry-run* (voir ce qui changerait) avant *apply* (changer). - **Elle empêche l'invalide.** Le meilleur garde-fou n'est pas un message d'erreur : c'est une interface où l'erreur est **impossible à saisir**. --- ## ② Comment Set-OPS le fait `make inventaire-ui` lance une console web **locale** (`127.0.0.1`, protégée par un jeton). Ses vues : | Vues **éditables** (le plan) | Vues **dérivées** (lecture seule) | |---|---| | Serveurs · Applications · Bases · Domaines · **Intrants** | Flux · Couches · **Réseau** (flotte + devis) | Le flux d'exploitation, de bout en bout : 1. **Éditer** une vue du plan → **Sauvegarder** ; 2. **« Appliquer le plan »** → régénère l'inventaire (VMID/IP/VLAN **dérivés**) ; 3. **Vérifier** (dry-run) sur un hôte → prévisualise sans rien changer ; 4. **Déployer** → applique les rôles (confirmation **renforcée** si l'instance est en **PROD**) ; 5. **Créer la VM** → clone sur Proxmox depuis le plan. **L'erreur rendue impossible.** Le champ « Hôte » d'une application est un `` « Hôte » ne montre **que des hôtes réels**. Choisis le bon, **Sauvegarder**, **Appliquer**. Tu ne *peux pas* re-saisir le fantôme. 4. **Bascule d'instance.** Vue **Réseau**, bouton **« Activer »** sur une autre instance. Toutes les vues suivent, sans redémarrer. 5. **Sens le garde-fou.** Essaie de sauvegarder un plan incohérent (ex. une base dont le consommateur n'existe pas) : la console **refuse** avec une raison. L'invalide ne passe pas. 6. **Casse & répare.** Édite `hosts.yml` à la main, reviens dans la GUI, « Appliquer le plan » : ta modification est **écrasée** par le plan. La source de vérité, c'est le plan — pas l'inventaire. --- ## Pour aller plus loin *(dépôt)* - Lancer : `make inventaire-ui` ; le code : `scripts/inventory_gui.py`. - Ce que le GUI sait écrire (et la preuve) : `scripts/couverture_gui.py` (P19). - Le flux plan → apply : unité **[Infra as Code & idempotence](Infra-as-Code-et-idempotence)**. - La flotte : unité **[Multi-instance & fédération](Multi-instance-et-fédération)**.