2026-08-23 14:41:56 -04:00
|
|
|
---
|
|
|
|
|
- name: Exiger un hôte de source d'artefacts quand l'intégration est active
|
|
|
|
|
ansible.builtin.assert:
|
|
|
|
|
that:
|
|
|
|
|
- client_artefacts_hote | length > 0
|
|
|
|
|
fail_msg: >-
|
|
|
|
|
client_artefacts est actif mais aucun hôte ne porte `serveur_artefacts`.
|
|
|
|
|
Déclarer le service au plan, ou forcer client_artefacts_actif=false.
|
|
|
|
|
when: client_artefacts_actif | bool
|
|
|
|
|
|
artefacts : deux filets — un cache mort ne doit plus rendre un tenant irreparable
CE CACHE EST UN MAILLON DONT DEPEND SA PROPRE RECONSTRUCTION. Toute la flotte y
prend ses paquets. S il pointe vers un amont mort, apt echoue sur les quinze
machines, donc le socle echoue, donc le deploiement n atteint jamais la couche qui
poserait le bon amont. LE CORRECTIF SE RETROUVE DANS LA COUCHE QUE LA PANNE EMPECHE
D ATTEINDRE, et il faut une main pour en sortir.
C est arrive le 2026-08-31 : l amont pointait sur le cache de patient 0, eteint la
veille pour liberer de la RAM. apt rendait « 503 Connection timeout » EN CITANT
L ADRESSE DU CACHE LOCAL, jamais celle de l amont manquant — la panne accusait le
maillon visible.
DEUX FILETS, SYMETRIQUES.
serveur_artefacts sonde l amont AVANT d ecrire, et refuse s il est muet : mieux
vaut un cache qui garde sa configuration precedente qu un cache qu on vient de
rendre inutilisable pour toute la flotte.
client_artefacts sonde la source AVANT de detourner apt vers elle. Ce fichier
ECRASE le plancher d amorcage pose par le socle — le poser sur un cache mort prive
la machine du cache du SITE, qui lui fonctionnait. En refusant, le plancher reste :
la flotte est degradee mais debout, et REPARABLE PAR UN DEPLOIEMENT.
`ignore_errors` ET NON `failed_when: false` — la difference est toute la garde.
failed_when: false REECRIT le verdict : la tache n est plus jamais failed, donc
`is not failed` est toujours vrai, donc l assertion ne peut pas tirer. Ecrite ainsi,
ma premiere version a declare « joignable » un amont mesure MUET la seconde d avant.
Une garde qui ne peut pas echouer ne garde rien.
Deux controles verifies sur la machine : amont eteint -> refuse ; amont reel -> pose.
make verifier : vert. make prouver : CONFORME, 55 OK, 0 echec, 0 saute.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
2026-08-31 18:31:21 -04:00
|
|
|
# --- LE FILET, COTE CLIENT : NE PAS VISER UN CACHE QUI NE SERT PAS ------------
|
|
|
|
|
#
|
|
|
|
|
# Symetrique de la garde de `serveur_artefacts` (mesure du 2026-08-31). Celle-la protege
|
|
|
|
|
# le CACHE d'un amont mort ; celle-ci protege LA FLOTTE d'un cache mort.
|
|
|
|
|
#
|
|
|
|
|
# Ce fichier ECRASE le plancher d'amorcage pose par le socle — il trie apres. Le poser
|
|
|
|
|
# alors que le cache du tenant ne repond pas prive donc la machine du cache du SITE, qui
|
|
|
|
|
# lui fonctionnait : on remplace une source qui marche par une qui ne marche pas.
|
|
|
|
|
#
|
|
|
|
|
# Quinze machines ont ainsi perdu `apt` d'un coup, et le deploiement ne pouvait plus
|
|
|
|
|
# atteindre la couche qui aurait repare le cache. En laissant le plancher en place, elles
|
|
|
|
|
# restent servies par le site — dégradé, mais debout, et reparable par un deploiement.
|
|
|
|
|
- name: La source de l'écosystème répond-elle vraiment ?
|
|
|
|
|
ansible.builtin.wait_for:
|
|
|
|
|
host: "{{ client_artefacts_hote }}.{{ domaine_interne }}"
|
|
|
|
|
port: "{{ client_artefacts_port }}"
|
|
|
|
|
timeout: 10
|
|
|
|
|
register: client_artefacts_sonde
|
|
|
|
|
changed_when: false
|
|
|
|
|
# `ignore_errors` ET NON `failed_when: false` — LA DIFFERENCE EST TOUTE LA GARDE.
|
|
|
|
|
#
|
|
|
|
|
# `failed_when: false` REECRIT le verdict : la tache n'est plus jamais `failed`, donc
|
|
|
|
|
# `is not failed` est toujours vrai, donc l'assertion qui suit ne peut PAS tirer. Ecrite
|
|
|
|
|
# ainsi, elle a declare « joignable » un amont mesure MUET la seconde d'avant
|
|
|
|
|
# (2026-08-31). Une garde qui ne peut pas echouer ne garde rien.
|
|
|
|
|
#
|
|
|
|
|
# `ignore_errors` laisse le verdict intact et se contente de ne pas arreter le play :
|
|
|
|
|
# c'est ce qu'il faut pour SONDER puis DECIDER.
|
|
|
|
|
ignore_errors: true
|
|
|
|
|
when:
|
|
|
|
|
- client_artefacts_actif | bool
|
|
|
|
|
- not ansible_check_mode
|
|
|
|
|
|
reconstruction : quatre defauts que seule une flotte rasee pouvait montrer
Chezlepro detruite (15 VM, disques compris) et refaite depuis le gabarit
minimal. 15/15 hotes, 0 echec ; make valider passe, test de restitution
compris. Aucun defaut ne venait de la flotte ni du gabarit.
1. Un avertissement n est pas un echec. Proxmox rend WARNINGS: n pour une
tache ABOUTIE ; la garde n acceptait que OK et declarait perdues cinq VM
clonees a 100 pourcent. Le message parlait d etat stopped — celui de la
TACHE, pas de la VM.
2. client_artefacts se contredisait : son commentaire disait de degrader, son
code arretait. L autorite monte en premier, donc avant le cache du
locataire : aucun ordre ne pouvait satisfaire la garde.
3. harden-below-nxdomain etendait le NXDOMAIN signe de la racine pour le TLD
internal a toute la zone du site, sans jamais interroger l autoritatif.
Declencheur : toute question sur un nom absent sous internal, y compris la
zone d un autre locataire. Le cache contenait la bonne reponse ET un
message negatif ; c est le negatif qui etait servi.
aggressive-nsec: no avait semble marcher — c est le redemarrage qui vidait
le cache, pas le reglage.
4. Un locataire doit savoir a qui demander la zone de son hebergeur, sans quoi
il ne peut plus nommer son depot de sauvegarde. La derivation prenait
dns_amorcage pour le resolveur du site : faux chez Technolibre, dont
l amorcage est 9.9.9.9. P03 l a attrape avant tout deploiement.
Au passage : instancier tentait encore le mot de passe unique d avant la
separation des voutes ; comparer echouait en exit 4.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
2026-09-02 09:59:15 -04:00
|
|
|
# DEGRADER, PAS ARRETER — le commentaire ci-dessus disait deja quoi faire, le code
|
|
|
|
|
# faisait autre chose (mesure du 2026-09-01, reconstruction de Chezlepro depuis zero).
|
|
|
|
|
#
|
|
|
|
|
# La garde etait une `assert` qui ARRETAIT le deploiement. Or ce qu'elle protege, c'est
|
|
|
|
|
# le plancher d'amorcage du site : il suffit de NE PAS l'ecraser. Arreter en plus, ca ne
|
|
|
|
|
# protege rien de plus, et ca rend la reconstruction depuis zero IMPOSSIBLE.
|
|
|
|
|
#
|
|
|
|
|
# CE QUE CA A COUTE : `_amorcer-socle` monte l'autorite en premier, comme il se doit.
|
|
|
|
|
# `infra-pki-01` est donc la premiere machine debout — a un moment ou le cache du
|
|
|
|
|
# locataire, qui vit DANS la flotte qu'on reconstruit, n'existe evidemment pas encore.
|
|
|
|
|
# La garde tirait sur la premiere machine de la premiere couche, et tout s'arretait la.
|
|
|
|
|
# Aucun ordre de deploiement ne pouvait la satisfaire : la contradiction etait dans la
|
|
|
|
|
# garde, pas dans le plan.
|
|
|
|
|
#
|
|
|
|
|
# Le comportement juste est la CONVERGENCE : tant que la source du locataire est muette,
|
|
|
|
|
# la machine reste servie par le site — degradee, debout, et reparable par le passage
|
|
|
|
|
# suivant. Quand `serveur_artefacts` sera monte sur son hote, le deploiement d'apres
|
|
|
|
|
# basculera apt de lui-meme.
|
|
|
|
|
#
|
|
|
|
|
# On le DIT, fort : une machine qui reste sur le cache du site alors qu'elle devrait
|
|
|
|
|
# etre passee a celui de son ecosysteme est un ecart qu'il faut pouvoir lire dans le
|
|
|
|
|
# journal, pas deviner.
|
|
|
|
|
- name: Rester sur le cache du SITE tant que celui de l'écosystème est muet
|
|
|
|
|
ansible.builtin.debug:
|
|
|
|
|
msg: >-
|
|
|
|
|
{{ client_artefacts_hote }}:{{ client_artefacts_port }} ne repond pas — apt N'EST
|
|
|
|
|
PAS detourne. Cette machine reste servie par le cache d'amorcage du SITE, qui
|
|
|
|
|
fonctionne : degrade, debout, reparable. La bascule se fera au deploiement suivant,
|
|
|
|
|
une fois `serveur_artefacts` monte sur {{ client_artefacts_hote }}.
|
artefacts : deux filets — un cache mort ne doit plus rendre un tenant irreparable
CE CACHE EST UN MAILLON DONT DEPEND SA PROPRE RECONSTRUCTION. Toute la flotte y
prend ses paquets. S il pointe vers un amont mort, apt echoue sur les quinze
machines, donc le socle echoue, donc le deploiement n atteint jamais la couche qui
poserait le bon amont. LE CORRECTIF SE RETROUVE DANS LA COUCHE QUE LA PANNE EMPECHE
D ATTEINDRE, et il faut une main pour en sortir.
C est arrive le 2026-08-31 : l amont pointait sur le cache de patient 0, eteint la
veille pour liberer de la RAM. apt rendait « 503 Connection timeout » EN CITANT
L ADRESSE DU CACHE LOCAL, jamais celle de l amont manquant — la panne accusait le
maillon visible.
DEUX FILETS, SYMETRIQUES.
serveur_artefacts sonde l amont AVANT d ecrire, et refuse s il est muet : mieux
vaut un cache qui garde sa configuration precedente qu un cache qu on vient de
rendre inutilisable pour toute la flotte.
client_artefacts sonde la source AVANT de detourner apt vers elle. Ce fichier
ECRASE le plancher d amorcage pose par le socle — le poser sur un cache mort prive
la machine du cache du SITE, qui lui fonctionnait. En refusant, le plancher reste :
la flotte est degradee mais debout, et REPARABLE PAR UN DEPLOIEMENT.
`ignore_errors` ET NON `failed_when: false` — la difference est toute la garde.
failed_when: false REECRIT le verdict : la tache n est plus jamais failed, donc
`is not failed` est toujours vrai, donc l assertion ne peut pas tirer. Ecrite ainsi,
ma premiere version a declare « joignable » un amont mesure MUET la seconde d avant.
Une garde qui ne peut pas echouer ne garde rien.
Deux controles verifies sur la machine : amont eteint -> refuse ; amont reel -> pose.
make verifier : vert. make prouver : CONFORME, 55 OK, 0 echec, 0 saute.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
2026-08-31 18:31:21 -04:00
|
|
|
when:
|
|
|
|
|
- client_artefacts_actif | bool
|
|
|
|
|
- not ansible_check_mode
|
reconstruction : quatre defauts que seule une flotte rasee pouvait montrer
Chezlepro detruite (15 VM, disques compris) et refaite depuis le gabarit
minimal. 15/15 hotes, 0 echec ; make valider passe, test de restitution
compris. Aucun defaut ne venait de la flotte ni du gabarit.
1. Un avertissement n est pas un echec. Proxmox rend WARNINGS: n pour une
tache ABOUTIE ; la garde n acceptait que OK et declarait perdues cinq VM
clonees a 100 pourcent. Le message parlait d etat stopped — celui de la
TACHE, pas de la VM.
2. client_artefacts se contredisait : son commentaire disait de degrader, son
code arretait. L autorite monte en premier, donc avant le cache du
locataire : aucun ordre ne pouvait satisfaire la garde.
3. harden-below-nxdomain etendait le NXDOMAIN signe de la racine pour le TLD
internal a toute la zone du site, sans jamais interroger l autoritatif.
Declencheur : toute question sur un nom absent sous internal, y compris la
zone d un autre locataire. Le cache contenait la bonne reponse ET un
message negatif ; c est le negatif qui etait servi.
aggressive-nsec: no avait semble marcher — c est le redemarrage qui vidait
le cache, pas le reglage.
4. Un locataire doit savoir a qui demander la zone de son hebergeur, sans quoi
il ne peut plus nommer son depot de sauvegarde. La derivation prenait
dns_amorcage pour le resolveur du site : faux chez Technolibre, dont
l amorcage est 9.9.9.9. P03 l a attrape avant tout deploiement.
Au passage : instancier tentait encore le mot de passe unique d avant la
separation des voutes ; comparer echouait en exit 4.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
2026-09-02 09:59:15 -04:00
|
|
|
- client_artefacts_sonde is failed
|
artefacts : deux filets — un cache mort ne doit plus rendre un tenant irreparable
CE CACHE EST UN MAILLON DONT DEPEND SA PROPRE RECONSTRUCTION. Toute la flotte y
prend ses paquets. S il pointe vers un amont mort, apt echoue sur les quinze
machines, donc le socle echoue, donc le deploiement n atteint jamais la couche qui
poserait le bon amont. LE CORRECTIF SE RETROUVE DANS LA COUCHE QUE LA PANNE EMPECHE
D ATTEINDRE, et il faut une main pour en sortir.
C est arrive le 2026-08-31 : l amont pointait sur le cache de patient 0, eteint la
veille pour liberer de la RAM. apt rendait « 503 Connection timeout » EN CITANT
L ADRESSE DU CACHE LOCAL, jamais celle de l amont manquant — la panne accusait le
maillon visible.
DEUX FILETS, SYMETRIQUES.
serveur_artefacts sonde l amont AVANT d ecrire, et refuse s il est muet : mieux
vaut un cache qui garde sa configuration precedente qu un cache qu on vient de
rendre inutilisable pour toute la flotte.
client_artefacts sonde la source AVANT de detourner apt vers elle. Ce fichier
ECRASE le plancher d amorcage pose par le socle — le poser sur un cache mort prive
la machine du cache du SITE, qui lui fonctionnait. En refusant, le plancher reste :
la flotte est degradee mais debout, et REPARABLE PAR UN DEPLOIEMENT.
`ignore_errors` ET NON `failed_when: false` — la difference est toute la garde.
failed_when: false REECRIT le verdict : la tache n est plus jamais failed, donc
`is not failed` est toujours vrai, donc l assertion ne peut pas tirer. Ecrite ainsi,
ma premiere version a declare « joignable » un amont mesure MUET la seconde d avant.
Une garde qui ne peut pas echouer ne garde rien.
Deux controles verifies sur la machine : amont eteint -> refuse ; amont reel -> pose.
make verifier : vert. make prouver : CONFORME, 55 OK, 0 echec, 0 saute.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
2026-08-31 18:31:21 -04:00
|
|
|
|
2026-08-23 14:41:56 -04:00
|
|
|
- name: Diriger apt vers la source de l'écosystème
|
|
|
|
|
ansible.builtin.copy:
|
|
|
|
|
dest: "{{ client_artefacts_fichier }}"
|
|
|
|
|
content: |
|
|
|
|
|
// GÉNÉRÉ par Set-OPS (rôle client_artefacts). NE PAS éditer à la main.
|
|
|
|
|
// Les paquets viennent de l'écosystème, pas de six serveurs étrangers.
|
|
|
|
|
Acquire::http::Proxy "http://{{ client_artefacts_hote }}.{{ domaine_interne }}:{{ client_artefacts_port }}";
|
|
|
|
|
{% if client_artefacts_https | bool %}
|
|
|
|
|
Acquire::https::Proxy "http://{{ client_artefacts_hote }}.{{ domaine_interne }}:{{ client_artefacts_port }}";
|
|
|
|
|
{% else %}
|
|
|
|
|
// « DIRECT » EST OBLIGATOIRE, PAS DECORATIF (mesure du 2026-08-23).
|
|
|
|
|
//
|
|
|
|
|
// apt fait HERITER `Acquire::https::Proxy` de la valeur HTTP quand elle n'est pas
|
|
|
|
|
// definie. Poser le seul proxy HTTP envoyait donc AUSSI les depots tiers en HTTPS
|
|
|
|
|
// dans le cache, qui refuse les tunnels — a juste titre :
|
|
|
|
|
// « Invalid response from proxy: HTTP/1.0 403 CONNECT denied »
|
|
|
|
|
// et packages.smallstep.com devenait injoignable pour toute la flotte.
|
|
|
|
|
Acquire::https::Proxy "DIRECT";
|
|
|
|
|
{% endif %}
|
|
|
|
|
owner: root
|
|
|
|
|
group: root
|
|
|
|
|
mode: "0644"
|
reconstruction : quatre defauts que seule une flotte rasee pouvait montrer
Chezlepro detruite (15 VM, disques compris) et refaite depuis le gabarit
minimal. 15/15 hotes, 0 echec ; make valider passe, test de restitution
compris. Aucun defaut ne venait de la flotte ni du gabarit.
1. Un avertissement n est pas un echec. Proxmox rend WARNINGS: n pour une
tache ABOUTIE ; la garde n acceptait que OK et declarait perdues cinq VM
clonees a 100 pourcent. Le message parlait d etat stopped — celui de la
TACHE, pas de la VM.
2. client_artefacts se contredisait : son commentaire disait de degrader, son
code arretait. L autorite monte en premier, donc avant le cache du
locataire : aucun ordre ne pouvait satisfaire la garde.
3. harden-below-nxdomain etendait le NXDOMAIN signe de la racine pour le TLD
internal a toute la zone du site, sans jamais interroger l autoritatif.
Declencheur : toute question sur un nom absent sous internal, y compris la
zone d un autre locataire. Le cache contenait la bonne reponse ET un
message negatif ; c est le negatif qui etait servi.
aggressive-nsec: no avait semble marcher — c est le redemarrage qui vidait
le cache, pas le reglage.
4. Un locataire doit savoir a qui demander la zone de son hebergeur, sans quoi
il ne peut plus nommer son depot de sauvegarde. La derivation prenait
dns_amorcage pour le resolveur du site : faux chez Technolibre, dont
l amorcage est 9.9.9.9. P03 l a attrape avant tout deploiement.
Au passage : instancier tentait encore le mot de passe unique d avant la
separation des voutes ; comparer echouait en exit 4.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
2026-09-02 09:59:15 -04:00
|
|
|
when:
|
|
|
|
|
- client_artefacts_actif | bool
|
|
|
|
|
# Ne jamais ecraser le plancher du site par une source qu'on n'a pas VU repondre.
|
|
|
|
|
# En `check_mode` la sonde ne tourne pas : `is failed` est alors faux, et on garde
|
|
|
|
|
# le comportement de simulation d'avant.
|
|
|
|
|
- not (client_artefacts_sonde is failed)
|
2026-08-23 14:41:56 -04:00
|
|
|
|
|
|
|
|
# L'écosystème qui RETIRE sa source d'artefacts doit voir ses hôtes revenir à l'amont,
|
|
|
|
|
# sans quoi ils resteraient braqués sur une machine disparue et n'installeraient plus
|
|
|
|
|
# rien. Une intégration qui ne sait pas se retirer est un piège différé.
|
|
|
|
|
- name: Retirer la direction quand l'écosystème n'a pas de source
|
|
|
|
|
ansible.builtin.file:
|
|
|
|
|
path: "{{ client_artefacts_fichier }}"
|
|
|
|
|
state: absent
|
|
|
|
|
when: not (client_artefacts_actif | bool)
|