Set-OPS-Public/roles/resoudre_idp/tasks/main.yml
Daniel Allaire 6699935dc7 resoudre_idp : le nom invente etait dans QUATRE roles
`forge-01` a echoue sur une URL de decouverte pointant
`https://keycloak.<domaine>` — le nom que rien ne publie. J'avais corrige
exactement ca dans `serveur_oauth2_proxy` quelques heures plus tot, en croyant
regler un cas isole.

Il etait dans quatre roles : forgejo, grafana, nextcloud, oauth2-proxy. Chacun
fabriquait le meme nom par la meme convention. Une cinquieme correction a la main
aurait diverge comme les quatre autres.

`roles/resoudre_idp` lit l'exposition declaree au plan et rend hote, base et
discovery. Les roles n'en gardent qu'un REPLI nomme, jamais la valeur de travail.

Verifie en base sur forge-01 : discovery = auth.chezlepro.internal,
GroupClaimName = groups, AdminGroup = sysadmin.

Meme lecon que `resoudre_annuaire` hier : corriger la valeur la ou elle echoue ne
corrige que la. Ce sont les copies silencieuses qui coutent la journee suivante.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 15:33:32 -04:00

42 lines
2 KiB
YAML

---
# Role utilitaire (pas un groupe deployable) : resout l'URL PUBLIQUE du fournisseur
# d'identite depuis l'exposition que le plan declare.
#
# Sorties (facts) :
# resoudre_idp_hote — auth.<domaine> (le FQDN publie, pas un nom fabrique)
# resoudre_idp_base — https://<hote>/realms/<realm>
# resoudre_idp_discovery — .../.well-known/openid-configuration
#
# POURQUOI CE ROLE. Quatre roles fabriquaient `https://keycloak.<domaine>` par
# convention de nommage — un nom que RIEN ne publie : le plan expose Keycloak sous
# `auth.<domaine>`, et c'est ce nom que le DNS resout, que nginx sert et que
# Keycloak annonce dans son issuer. Un client OIDC qui interroge l'autre nom
# echoue, ou recoit un issuer qui ne correspond pas au sien.
#
# Corrige une premiere fois dans `serveur_oauth2_proxy` le 2026-08-07, puis
# retrouve a l'identique dans forgejo, grafana et nextcloud. Une quatrieme copie
# aurait diverge comme les trois premieres : d'ou ce role.
- name: Charger les registres applications et domaines (expositions)
ansible.builtin.include_vars:
file: "{{ item }}"
loop:
- "{{ setops_plan_dir }}/applications.yml"
- "{{ setops_plan_dir }}/domaines.yml"
- name: Exiger que l'IdP declare une exposition
ansible.builtin.assert:
that:
- ((applications | default({})).get(resoudre_idp_app, {}).get('expose', []) | length) > 0
fail_msg: >-
L'application `{{ resoudre_idp_app }}` n'expose aucun FQDN dans
instance/plan/applications.yml. Un client OIDC ne peut pas joindre un
fournisseur qui n'est publie nulle part.
- name: Deriver l'URL publique du fournisseur d'identite
ansible.builtin.set_fact:
resoudre_idp_hote: >-
{{ (applications[resoudre_idp_app].expose | first) }}
resoudre_idp_base: >-
https://{{ (applications[resoudre_idp_app].expose | first) }}/realms/{{ resoudre_idp_realm }}
resoudre_idp_discovery: >-
https://{{ (applications[resoudre_idp_app].expose | first) }}/realms/{{ resoudre_idp_realm }}/.well-known/openid-configuration