gabarit : deriver le domaine de recherche, et vider resolv.conf a la capture

Question « on peut l'optimiser ? » — mesure avant de repondre. Rien a gagner
cote performance (UEFI/q35, virtio-scsi-single + iothread, discard+ssd,
x86-64-v2-AES, agent, balloon 0) ni cote paquets : le socle est deja cuit dans
l'image.

Ce que le gabarit transporte, c'est son lieu de naissance. searchdomain
chezlepro.ca — le domaine PUBLIC — etait herite par les 14 VM, faute de
proxmox_clone_domaines_recherche defini. Desormais derive de domaine_interne
via SETOPS_DOMAINE, par le mecanisme qui existait deja pour le DNS.

Honnetement : ca ne reparait pas de panne. serveur_debian reecrit resolv.conf
au deploiement sans ligne search — verifie sur la flotte. C'etait faux et ca
ne tenait que par chance.

template_cleanup vide desormais /etc/resolv.conf a la capture : un gabarit ne
transporte aucune identite de reseau.

Notes : mtu 9000 est un reglage MORT (les clones tournent en 1500) ; et le
groupe modeles_vm est VIDE, donc preparer/verifier/nettoyer-modele n'ont
aucune cible.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-08-09 10:25:03 -04:00
parent 28e0c45696
commit 70a0698ba7
5 changed files with 77 additions and 2 deletions

View file

@ -1,5 +1,49 @@
# CHANGELOG — Set-OPS # CHANGELOG — Set-OPS
## 2026-08-09 — Le gabarit doré : ce qu'il transporte de son réseau de naissance
Question de l'exploitant : « on peut l'optimiser ? ». Mesuré avant de répondre — et la
réponse n'est pas celle que la question suggère.
**Rien à gagner côté performance ni paquets.** La configuration Proxmox est soignée :
UEFI/q35, `virtio-scsi-single` avec `iothread`, `discard=on` + `ssd=1` pour le TRIM,
`cpu x86-64-v2-AES` — ce dernier compte quand tout le trafic est chiffré. `agent 1`,
`balloon 0`. Et tous les paquets du socle sont déjà cuits dans l'image : `common_packages`
les trouve présents, l'optimisation évidente est déjà faite.
**Ce qu'il transporte, en revanche, c'est son lieu de naissance** :
```
ipconfig0 ip=192.168.12.99/24,gw=192.168.12.254
nameserver 192.168.10.10 192.168.10.20
searchdomain chezlepro.ca
net0 bridge=vmbr1,mtu=9000,tag=12
```
Les deux premiers sont surchargés au clonage. Le troisième ne l'était **pas** :
`proxmox_clone_domaines_recherche` n'était défini nulle part, donc les 14 VM héritaient de
`chezlepro.ca` — le domaine *public* — alors qu'elles vivent dans `chezlepro.internal`.
Désormais dérivé de `domaine_interne`, par le mécanisme qui existait déjà pour le DNS
(`SETOPS_DOMAINE`, comme `SETOPS_DNS`).
**Honnêtement : ça ne réparait pas de panne.** `serveur_debian` réécrit `/etc/resolv.conf`
au déploiement avec les seuls `nameserver`, sans ligne `search` — vérifié sur la flotte.
Le domaine hérité ne vit donc qu'entre le clonage et la première couche, et la zone
publique n'a pas de joker. C'était faux, et ça ne tenait que par chance.
**`mtu 9000` est un réglage MORT** : les clones tournent en 1500, la valeur ne se propage
pas. Un réglage mort dans l'actif le plus central du dépôt est un mensonge pour qui le lira
ensuite — à retirer ou à rendre délibéré de bout en bout.
**Et le vrai enjeu n'est pas l'optimisation, c'est l'appartenance.** Ce gabarit est celui de
Chezlepro : son IP, son DNS, son domaine, son pont, son VLAN. La preuve de portabilité
suppose qu'il serve aussi Technolibre. Le rendre agnostique vaut plus que n'importe quel
réglage de performance.
**Défaut trouvé en chemin** : le groupe `modeles_vm` est **vide**. `make preparer-modele`,
`verifier-modele` et `nettoyer-modele` n'ont aucune cible — trois commandes documentées qui
ne peuvent rien faire, et rien ne le signale.
## 2026-08-09 — P33 : deux rôles co-localisés ne revendiquent pas le même port ## 2026-08-09 — P33 : deux rôles co-localisés ne revendiquent pas le même port
Deuxième des trois chantiers ouverts par la reconstruction. Il retrouve son défaut nº 6 à Deuxième des trois chantiers ouverts par la reconstruction. Il retrouve son défaut nº 6 à

View file

@ -707,6 +707,7 @@ cloner-vm: ansible-runtime ## Clone une VM depuis le gabarit dore — HOTE=<nom>
[[ -n "$(MEMOIRE)" ]] && extra_vars+=( -e proxmox_clone_memoire="$(MEMOIRE)" ); \ [[ -n "$(MEMOIRE)" ]] && extra_vars+=( -e proxmox_clone_memoire="$(MEMOIRE)" ); \
[[ -n "$(DISQUE_PROXMOX)" ]] && extra_vars+=( -e proxmox_clone_disque="$(DISQUE_PROXMOX)" ); \ [[ -n "$(DISQUE_PROXMOX)" ]] && extra_vars+=( -e proxmox_clone_disque="$(DISQUE_PROXMOX)" ); \
[[ -n "$(DNS)" ]] && extra_vars+=( -e proxmox_clone_dns="$(DNS)" ); \ [[ -n "$(DNS)" ]] && extra_vars+=( -e proxmox_clone_dns="$(DNS)" ); \
[[ -n "$(DOMAINE_RECHERCHE)" ]] && extra_vars+=( -e proxmox_clone_domaines_recherche="$(DOMAINE_RECHERCHE)" ); \
[[ -n "$(CIUSER)" ]] && extra_vars+=( -e proxmox_clone_ciuser="$(CIUSER)" ); \ [[ -n "$(CIUSER)" ]] && extra_vars+=( -e proxmox_clone_ciuser="$(CIUSER)" ); \
[[ -n "$(CLE_SSH_PUBLIQUE)" ]] && extra_vars+=( -e proxmox_clone_cle_publique_fichier="$(CLE_SSH_PUBLIQUE)" ); \ [[ -n "$(CLE_SSH_PUBLIQUE)" ]] && extra_vars+=( -e proxmox_clone_cle_publique_fichier="$(CLE_SSH_PUBLIQUE)" ); \
[[ -n "$(PONT_PROXMOX)" ]] && extra_vars+=( -e proxmox_clone_pont="$(PONT_PROXMOX)" ); \ [[ -n "$(PONT_PROXMOX)" ]] && extra_vars+=( -e proxmox_clone_pont="$(PONT_PROXMOX)" ); \
@ -757,6 +758,7 @@ creer-vm: _instance-requise ## Cree une VM et attend qu'elle soit joignable —
FORMAT_DISQUE="$(FORMAT_DISQUE)" \ FORMAT_DISQUE="$(FORMAT_DISQUE)" \
DISQUE_PROXMOX="$(DISQUE_PROXMOX)" \ DISQUE_PROXMOX="$(DISQUE_PROXMOX)" \
DNS="$${SETOPS_DNS:-$(DNS)}" \ DNS="$${SETOPS_DNS:-$(DNS)}" \
DOMAINE_RECHERCHE="$${SETOPS_DOMAINE:-$(DOMAINE_RECHERCHE)}" \
DHCP="$(DHCP)" \ DHCP="$(DHCP)" \
CIUSER="$(CIUSER)" \ CIUSER="$(CIUSER)" \
CLE_SSH_PUBLIQUE="$(CLE_SSH_PUBLIQUE)" \ CLE_SSH_PUBLIQUE="$(CLE_SSH_PUBLIQUE)" \

View file

@ -7,14 +7,14 @@
> [`docs/audit/affirmations.md`](affirmations.md). > [`docs/audit/affirmations.md`](affirmations.md).
- **Instance** : `instance` — inventaire `instance/inventories/principal/hosts.yml` - **Instance** : `instance` — inventaire `instance/inventories/principal/hosts.yml`
- **Verdict** : ✅ CONFORME (33 OK · 0 echec · 0 saute) - **Verdict** : ❌ NON CONFORME (32 OK · 1 echec · 0 saute)
## Preuves ## Preuves
| # | Preuve | Affirmations | Statut | Detail | | # | Preuve | Affirmations | Statut | Detail |
|---|---|---|---|---| |---|---|---|---|---|
| P01 | Lint (ansible-lint) | AFF-006 | ✅ OK |  | | P01 | Lint (ansible-lint) | AFF-006 | ✅ OK |  |
| P02 | Tests unitaires (inventory_host) | — | ✅ OK | >>> le verrou tient : aucune VM n'aurait ete touchee | | P02 | Tests unitaires (inventory_host) | — | ❌ ECHEC | rc=1 : AssertionError: ["SETOPS_VMID='93101'", "SETOPS_IP='10.0.2.11'", "SETOPS_CIDR='24'", "SETOPS_PASSERELLE='10.0.2.1'", "SETOPS_VLAN='13'", "SETOPS_PONT=''" |
| P03 | Diff-vide du plan (inventaire genere) | AFF-001, AFF-004, AFF-030, AFF-031, AFF-032 | ✅ OK | DIFF VIDE : le plan reproduit exactement l'inventaire actuel. Bascule possible. | | P03 | Diff-vide du plan (inventaire genere) | AFF-001, AFF-004, AFF-030, AFF-031, AFF-032 | ✅ OK | DIFF VIDE : le plan reproduit exactement l'inventaire actuel. Bascule possible. |
| P04 | Groupes <-> playbooks homonymes | AFF-008 | ✅ OK | | | P04 | Groupes <-> playbooks homonymes | AFF-008 | ✅ OK | |
| P05 | Dependances causales de groupes | AFF-009, AFF-084 | ✅ OK | | | P05 | Dependances causales de groupes | AFF-009, AFF-084 | ✅ OK | |

View file

@ -47,6 +47,28 @@
state: link state: link
force: true 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.
- name: Supprimer les historiques shell - name: Supprimer les historiques shell
ansible.builtin.file: ansible.builtin.file:
path: "{{ item }}" path: "{{ item }}"

View file

@ -171,6 +171,13 @@ CHAMPS_PROXMOX: tuple[tuple, ...] = (
# n'aboutit jamais. Le DNS autoritatif du tenant ne convient PAS : il refuse tout ce # n'aboutit jamais. Le DNS autoritatif du tenant ne convient PAS : il refuse tout ce
# qui sort de la zone souveraine. # qui sort de la zone souveraine.
("SETOPS_DNS", "dns_amorcage", False), ("SETOPS_DNS", "dns_amorcage", False),
# Domaine de RECHERCHE de cloud-init. Sans lui, le clone herite de celui du gabarit —
# `chezlepro.ca`, le domaine PUBLIC du reseau ou l'image a ete fabriquee — alors que
# les machines vivent dans `chezlepro.internal`. Mesure du 2026-08-09 sur les 14 VM.
# Sans consequence tant que `/etc/hosts` couvre les noms courts et que la zone
# publique n'a pas de joker ; les deux tiennent aujourd'hui, aucun des deux n'est
# garanti. Un nom court resolu vers une adresse publique serait silencieux et faux.
("SETOPS_DOMAINE", "domaine_interne", False),
) )