`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>
42 lines
2 KiB
YAML
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
|