--- - name: Refuser le nettoyage sans confirmation explicite ansible.builtin.assert: that: - template_cleanup_confirm | bool fail_msg: "Nettoyage refusé. Relancer avec -e template_cleanup_confirm=true" - name: Nettoyer cloud-init ansible.builtin.command: cloud-init clean --logs changed_when: true - name: Nettoyer le cache APT ansible.builtin.apt: clean: true - name: Supprimer les paquets devenus inutiles ansible.builtin.apt: autoremove: true - name: Rotation des journaux systemd ansible.builtin.command: journalctl --rotate changed_when: true failed_when: false - name: Vider les anciens journaux systemd ansible.builtin.command: journalctl --vacuum-time=1s changed_when: true failed_when: false - name: Vider /etc/machine-id ansible.builtin.copy: dest: /etc/machine-id content: "" owner: root group: root mode: "0444" - name: Supprimer l'ancien machine-id D-Bus ansible.builtin.file: path: /var/lib/dbus/machine-id state: absent - name: Recréer le lien D-Bus vers /etc/machine-id ansible.builtin.file: src: /etc/machine-id dest: /var/lib/dbus/machine-id state: link force: true # Le gabarit ne doit transporter AUCUNE identite de reseau. Sans ce nettoyage, il emporte # le `/etc/resolv.conf` du reseau ou il a ete fabrique : mesure du 2026-08-08 sur une VM # neuve du tenant, `nameserver 192.168.12.254` — injoignable depuis son VLAN. La machine # naissait donc sans resolution, cloud-init perdait son temps sur des `apt` qui # echouaient, et la tache capable de reparer le fichier vit dans `serveur_debian`, # c'est-a-dire APRES l'attente de premier demarrage. # # On le VIDE plutot que de le supprimer : un fichier absent se recree en silence avec # n'importe quoi, un fichier qui s'explique dit ou regarder. Le resolveur reel est pose # au deploiement depuis l'intrant `dns_amorcage`. - name: Vider le resolveur herite du reseau de fabrication ansible.builtin.copy: dest: /etc/resolv.conf owner: root group: root mode: "0644" content: | # Vide a la capture du gabarit (role template_cleanup). # Le resolveur est pose au deploiement depuis l'intrant `dns_amorcage` # (playbooks/groupes/serveur_debian.yml, avant le premier apt). # Un gabarit ne transporte aucune identite de reseau. # Un gabarit ne doit transporter AUCUNE cle privee. Sans ce nettoyage, l'image porte la # cle d'hote SSH de la machine de fabrication : quiconque detient l'image detient de quoi # se faire passer pour n'importe quelle VM qui n'aurait pas regenere la sienne. # # La regeneration est faite par cloud-init au premier demarrage (module `ssh`, qui # recree les cles absentes) — verifie le 2026-08-09 : les hotes de la flotte portent des # empreintes toutes differentes. C'est cette regeneration qui rend la suppression sure ; # la desactiver rendrait les VM sans cle d'hote, donc sans sshd. - name: Supprimer les cles d hote SSH (regenerees par cloud-init au premier demarrage) ansible.builtin.shell: cmd: rm -f /etc/ssh/ssh_host_* removes: /etc/ssh/ssh_host_ed25519_key - name: Supprimer les historiques shell ansible.builtin.file: path: "{{ item }}" state: absent loop: - /root/.bash_history - "/home/{{ template_cleanup_admin_user }}/.bash_history" failed_when: false - name: Message final ansible.builtin.debug: msg: - "Nettoyage final terminé." - "Éteindre la VM puis convertir en template Proxmox."