--- # CE QUE CE ROLE FERME. cloud-init n'est pas un logiciel d'installation : c'est une SOURCE # DE VERITE EXTERNE, qui se reveille a CHAQUE demarrage et relit le lecteur cloud-init # attache par l'hyperviseur. Ce lecteur peut redefinir les comptes, les cles SSH # autorisees, les mots de passe et le reseau. Sur une machine qu'Ansible possede # desormais, c'est un second maitre — que le plan ne decrit pas, que `make valider` ne # mesure pas, et qui gagne parce qu'il parle en premier. # # Sa tache est finie : il a donne a la VM son adresse, son nom et ses cles d'hote a la # premiere seconde. C'est precisement parce qu'il a REUSSI qu'Ansible a pu entrer. # # CE QUE CE ROLE NE FERME PAS, et le croire serait la mauvaise lecon. Il n'ote AUCUN # pouvoir a l'hebergeur. `qemu-guest-agent` est au gabarit — il doit y etre (P56) — et # l'API Proxmox expose sur son dos, sur toute VM vivante, un pouvoir STRICTEMENT PLUS # GRAND que le lecteur cloud-init : `exec`, `file-write`, `file-read`, # `set-user-password`, `shutdown` (releve le 2026-09-09 sur `edge-mta-01`). # # Ce qui est ferme ici est etroit et reel : (a) une reapplication AUTOMATIQUE, a chaque # demarrage, depuis un support que le plan ne possede pas et qu'aucune preuve ne lit ; # (b) le code de cloud-init lui-meme, un interpreteur Python complet execute en root au # demarrage. La mainmise de l'hyperviseur sur ses invites est une propriete de la # virtualisation, pas de cloud-init : elle appelle sa propre decision (D-85). # # POURQUOI LE RETIRER NE COUPE PAS LE RESEAU (mesure du 2026-09-09 sur `obs-01`) : # # /etc/network/interfaces.d/50-cloud-init -> dpkg -S : aucun paquet ne le possede # /var/lib/dpkg/info/cloud-init.postrm -> ne nomme jamais interfaces.d # # Le fichier survit donc au retrait, `interfaces` fait toujours `source interfaces.d/*`, # et l'adresse derivee du plan reste posee. Son en-tete annonce que les modifications # « ne persistent pas au redemarrage » : c'etait vrai TANT QUE cloud-init pouvait le # reecrire. Une fois le paquet parti, plus personne ne le reecrit — l'avertissement # devient caduc, et le fichier devient la configuration. # # ON LE MESURE QUAND MEME. Une machine qui perd ce fichier ne se plaint pas : elle repart # au prochain demarrage sans adresse, et plus personne ne peut entrer pour le constater. # On releve donc son etat AVANT et APRES, et on n'accuse que si le retrait l'a emporte. - name: Relever la configuration réseau AVANT le retrait ansible.builtin.stat: path: "{{ cloud_init_retrait_fichier_reseau }}" register: cloud_init_retrait_reseau_avant - name: Retirer cloud-init (sa tâche est finie à la première seconde) ansible.builtin.apt: name: "{{ cloud_init_retrait_paquets }}" state: absent purge: "{{ cloud_init_retrait_purge | bool }}" autoremove: "{{ cloud_init_retrait_autoremove | bool }}" - name: Relever la configuration réseau APRÈS le retrait ansible.builtin.stat: path: "{{ cloud_init_retrait_fichier_reseau }}" register: cloud_init_retrait_reseau_apres # La faute exacte, et elle seule : le fichier etait la, il n'y est plus. Une machine qui # n'en a jamais eu (reseau tenu autrement) ne doit pas faire echouer le durcissement. - name: Refuser si le retrait a emporté la configuration réseau ansible.builtin.assert: that: - not (cloud_init_retrait_reseau_avant.stat.exists and not cloud_init_retrait_reseau_apres.stat.exists) fail_msg: >- {{ cloud_init_retrait_fichier_reseau }} a disparu avec cloud-init. Cette machine n'aurait plus d'adresse au prochain démarrage. NE PAS REDÉMARRER : restaurer le fichier d'abord (la configuration attendue se dérive du plan). success_msg: >- {{ 'Configuration réseau intacte après le retrait.' if cloud_init_retrait_reseau_apres.stat.exists else 'Cette machine ne tient pas son réseau par cloud-init — rien à préserver.' }} # UNE REINSTALLATION PAR DEPENDANCE NE DOIT PAS RENDRE LE POUVOIR. `cloud-init` peut # revenir en recommandation d'un autre paquet ; ce drapeau est lu par cloud-init lui-meme # au demarrage et l'arrete avant qu'il ne lise la moindre source de donnees. - name: Poser le drapeau qui neutralise un cloud-init réinstallé ansible.builtin.copy: dest: /etc/cloud/cloud-init.disabled owner: root group: root mode: "0644" content: | # Pose par le role cloud_init_retrait (groupe serveur_durci). # cloud-init a fait son travail a la premiere seconde de cette VM ; il n'a plus a # se reveiller. Si le paquet revient par dependance, ce fichier l'arrete.