cloud-init n est pas un logiciel d installation : c est une SOURCE DE VERITE EXTERNE. Il se reveille a chaque demarrage et relit le lecteur attache par l hyperviseur, qui peut redefinir comptes, cles SSH, mots de passe et reseau. Sur une machine que le plan possede, c est un second maitre — que le plan ne decrit pas, que make valider ne mesure pas, et qui parle en premier. Sa tache est finie a la premiere seconde : c est parce qu il a REUSSI a poser l adresse et les cles qu Ansible a pu entrer. TROIS MOITIES, ET ELLES SE DEFONT SEPAREMENT. - le GABARIT le garde : sans lui un clone n a ni adresse ni nom ; - le SOCLE ne l installe plus : le garder produisait un va-et-vient a chaque deploiement, deux changed par passage, idempotence perdue ; - le DURCISSEMENT le retire (roles/cloud_init_retrait, en dernier). P63 garde les trois, plus le CONTENU du role : une coquille vide passerait les trois premiers controles sans rien fermer. Quatre controles negatifs rejoues. CE QUI REND LE RETRAIT SUR EST MESURE, PAS SUPPOSE (obs-01, 2026-09-09) : /etc/network/interfaces.d/50-cloud-init n appartient a aucun paquet — dpkg -S ne le trouve pas — et le postrm ne le nomme jamais, meme en purge. L adresse survit. Le role le verifie quand meme, avant et apres, et n accuse que si le retrait l a emporte : une VM qui perd ce fichier ne se plaint pas, elle repart sans adresse et plus personne ne peut entrer. DEUX CHOIX DITS FRANCHEMENT. cloud-guest-utils reste (growpart : ni service, ni port, ni source de donnees). Les ~29 paquets orphelins ne sont pas retires par defaut : autoremove deciderait a partir des drapeaux dpkg, et un durcissement ne doit pas pouvoir surprendre. NON DEPLOYE : le code est ecrit, valide et prouve ; il n a pas ete applique a la flotte. Essai a blanc sur obs-01 : cloud-init a retirer, configuration reseau intacte. make prouver : CONFORME, 62 OK, 0 echec, 1 saute (63 preuves). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
72 lines
3.7 KiB
YAML
72 lines
3.7 KiB
YAML
---
|
|
# 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.
|
|
#
|
|
# 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.
|