resoudre_annuaire : un plan muet fait refuser, plus de nom devine

Le defaut `id-ldap-01` tenait des que le plan se taisait : la derivation depuis
`applications.<app>.hote` etait sautee, et le role batissait `ldaps://<ce nom>`
— une machine qui n est dans aucun plan. Le consommateur echouait au premier
bind, apres un deploiement passe au vert de bout en bout.

La derivation avait ete ajoutee pour corriger exactement cela ; le defaut est
reste et ramenait l ancien comportement. Il est desormais vide, et une
assertion refuse AU DEPLOIEMENT. Une instance garde le droit de poser l hote
explicitement : ce qui disparait est la valeur DEVINEE, pas la surcharge.

Assisted-by: Claude Opus 5
This commit is contained in:
Mathieu Benoit 2026-09-29 03:55:06 -04:00
parent fbd4094d3f
commit bff1396af3
3 changed files with 25 additions and 2 deletions

View file

@ -32,7 +32,7 @@ d'annuaire.
## Variables
| Variable | Défaut | Rôle |
| --- | --- | --- |
| `resoudre_annuaire_hote` | `id-ldap-01` | **Le** point où le nom d'hôte est fixé (surchargeable par instance) |
| `resoudre_annuaire_hote` | `""` | Dérivé du PLAN (`applications.<app>.hote`) ; surchargeable par instance. Vide et non dérivé, le rôle REFUSE plutôt que de deviner |
| `resoudre_annuaire_port` | `636` | Port LDAPS |
| `resoudre_annuaire_encryption` | `ldaps` | Schéma de l'URI |
| `resoudre_annuaire_bind_cn` | `admin` | CN du compte de bind |

View file

@ -5,7 +5,19 @@
# aucune machine du plan (l'annuaire vit sur `idm-01`), et Postfix ne pouvait pas se lier.
# Constaté le 2026-08-07. Le repli ci-dessous ne sert que si le plan est muet.
resoudre_annuaire_app: "openldap"
resoudre_annuaire_hote: "id-ldap-01"
# VIDE, ET C'EST LE DEFAUT LUI-MEME QUI ETAIT LE PIEGE. Un nom ecrit ici tient des
# que le plan se tait : la derivation est sautee, le role bâtit
# `ldaps://<ce nom>.<domaine>`, et le consommateur echoue a l'execution sur
# « Unable to bind » en nommant une machine qui n'est dans aucun plan.
#
# La correction qui a introduit la derivation depuis le plan a laisse ce defaut en
# place ; il ramene donc l'ancien comportement chaque fois que l'application n'est
# pas au plan. Vide, l'assertion qui suit refuse AU DEPLOIEMENT, la ou le nom
# devine ne se voyait qu'au premier bind.
#
# Une instance garde le droit de le poser explicitement : ce qui disparait est la
# valeur DEVINEE, pas la surcharge.
resoudre_annuaire_hote: ""
resoudre_annuaire_port: 636
resoudre_annuaire_encryption: "ldaps"
# COMPTE DE LIAISON — CHAQUE CONSOMMATEUR A LE SIEN (2026-09-13).

View file

@ -37,6 +37,17 @@
resoudre_annuaire_hote: "{{ (applications | default({})).get(resoudre_annuaire_app, {}).get('hote') }}"
when: ((applications | default({})).get(resoudre_annuaire_app, {}).get('hote') | default('', true)) | length > 0
- name: Exiger que le plan nomme l'hôte de l'annuaire
ansible.builtin.assert:
that:
- resoudre_annuaire_hote | length > 0
fail_msg: >-
L'application « {{ resoudre_annuaire_app }} » n'est pas au plan, et aucune
instance ne pose `resoudre_annuaire_hote` : rien ne nomme l'annuaire. Le rôle
qui le demande ne peut pas s'y lier. Un nom deviné ici produirait
« Unable to bind » sur une machine qui n'est dans aucun plan — et le
déploiement passerait au VERT jusque-là.
# set_fact (pas les defaults) pour que ces valeurs persistent dans le rôle consommateur
# après include_role (les defaults du rôle inclus ne fuient pas hors de son exécution).
- name: Dériver la connexion à l'annuaire