Set-OPS-Public/roles/cloud_init_retrait/tasks/main.yml

85 lines
4.5 KiB
YAML
Raw Normal View History

durcissement : cloud-init nait avec la VM et ne lui survit pas 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
2026-09-09 09:25:42 -04:00
---
# 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.
#
D-85 : ce que le retrait de cloud-init NE ferme pas La premiere redaction se lisait comme une emancipation. Elle n en est pas une, et il valait mieux le dire que de laisser un lecteur presse en conclure trop. Retirer cloud-init 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 de la flotte, un pouvoir strictement plus grand que le lecteur cloud-init. Releve le 2026-09-09 sur edge-mta-01, avec le jeton du site : exec, exec-status, file-read, file-write, set-user-password, shutdown. Ce que D-85 ferme est donc precis et etroit : une reapplication AUTOMATIQUE a chaque demarrage, depuis un support que le plan ne possede pas et qu aucune preuve ne lit ; et le code de cloud-init lui-meme, un interpreteur Python complet execute en root au boot avec ses ~29 dependances. La mainmise d un hyperviseur sur ses invites est une propriete de la VIRTUALISATION, pas de cloud-init — elle appelle sa propre decision, qui n est pas prise. LE SEUIL EST NOMME. L alternative existe et sa piece est deja au gabarit : poser adresse et cle par agent/file-write + agent/exec, sans reseau. Aujourd hui ce serait reimplementer un standard, ce que positionnement.md interdit, au moment le plus fragile et pour le pire mode de panne — une VM injoignable. Le jour ou une premiere seconde ne pourra plus etre amorcee par Proxmox (autre hyperviseur, metal nu, hebergeur sans API), ce chemin devient LE chemin portable. La nuance est portee partout ou l affirmation est faite : D-85, le README et l entete du role, AGENTS.md, le wiki. make prouver : CONFORME, 62 OK, 0 echec, 1 saute. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-09 10:11:52 -04:00
# 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).
#
durcissement : cloud-init nait avec la VM et ne lui survit pas 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
2026-09-09 09:25:42 -04:00
# 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.