From 3bf99fa7bee3998e4b88abe0ba48ad0aa5cbef2a Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Sat, 8 Aug 2026 17:04:15 -0400 Subject: [PATCH] keycloak : les roles de realm sont un prerequis de la projection des groupes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Second defaut trouve par la reconstruction from-zero. groupes-ldap.yml attache grafana-admin a un groupe, mais c'est rbac-oidc.yml qui cree ce role — et il s'executait APRES. Invisible tant que le realm existait avec ses roles crees par un passage precedent ; sur un realm neuf, seuls les roles integres existaient et l'attachement echouait. Scinde plutot que deplace : rbac-oidc.yml fait trois choses aux dependances DISTINCTES — creer les roles (ne depend de rien), poser un mapper sur les clients (depend de clients-oidc), assigner des roles a des utilisateurs. Les melanger etait le defaut. L'ordre est desormais roles -> groupes -> clients -> mappers. Co-Authored-By: Claude Opus 5 --- roles/serveur_keycloak/tasks/main.yml | 4 +++ roles/serveur_keycloak/tasks/rbac-oidc.yml | 24 ------------- roles/serveur_keycloak/tasks/roles-realm.yml | 38 ++++++++++++++++++++ 3 files changed, 42 insertions(+), 24 deletions(-) create mode 100644 roles/serveur_keycloak/tasks/roles-realm.yml diff --git a/roles/serveur_keycloak/tasks/main.yml b/roles/serveur_keycloak/tasks/main.yml index 1885e06..14bffcc 100644 --- a/roles/serveur_keycloak/tasks/main.yml +++ b/roles/serveur_keycloak/tasks/main.yml @@ -171,6 +171,10 @@ ansible.builtin.include_tasks: courriel-realm.yml when: serveur_keycloak_smtp_actif | bool +- name: Créer les rôles de realm (prérequis de la projection des groupes) + ansible.builtin.include_tasks: roles-realm.yml + when: not ansible_check_mode + - name: Projeter les groupes LDAP (mapper + roles de groupe) ansible.builtin.include_tasks: groupes-ldap.yml when: diff --git a/roles/serveur_keycloak/tasks/rbac-oidc.yml b/roles/serveur_keycloak/tasks/rbac-oidc.yml index 8437cad..7c4f5e0 100644 --- a/roles/serveur_keycloak/tasks/rbac-oidc.yml +++ b/roles/serveur_keycloak/tasks/rbac-oidc.yml @@ -3,30 +3,6 @@ # Additif et idempotent (create-si-absent, kcadm à chaud — pas de restart Keycloak). # Permet à une app (ex. Grafana) de mapper un rôle du realm vers son niveau de droit. -- name: Assurer les roles de realm (kcadm, idempotent) - ansible.builtin.shell: - executable: /bin/bash - cmd: | - set -euo pipefail - KC={{ serveur_keycloak_home }}/bin/kcadm.sh - "$KC" config credentials --server http://localhost:8080 --realm master \ - --user {{ serveur_keycloak_admin_user }} --password "$KC_ADMIN_PW" >/dev/null - if "$KC" get roles/{{ item }} -r {{ serveur_keycloak_realm }} >/dev/null 2>&1; then - echo SETOPS_OK - else - "$KC" create roles -r {{ serveur_keycloak_realm }} -s name={{ item }} >/dev/null - echo SETOPS_CHANGED - fi - environment: - KC_ADMIN_PW: "{{ serveur_keycloak_admin_password }}" - loop: "{{ serveur_keycloak_realm_roles }}" - register: serveur_keycloak_role_reg - changed_when: "'SETOPS_CHANGED' in serveur_keycloak_role_reg.stdout" - no_log: true - when: - - not ansible_check_mode - - serveur_keycloak_realm_roles | length > 0 - - name: Assurer le mapper de roles de realm sur les clients (claim 'roles') ansible.builtin.shell: executable: /bin/bash diff --git a/roles/serveur_keycloak/tasks/roles-realm.yml b/roles/serveur_keycloak/tasks/roles-realm.yml new file mode 100644 index 0000000..c0e9981 --- /dev/null +++ b/roles/serveur_keycloak/tasks/roles-realm.yml @@ -0,0 +1,38 @@ +--- +# Creation des ROLES DE REALM — extrait de `rbac-oidc.yml` le 2026-08-08. +# +# Ces roles sont un PREREQUIS de `groupes-ldap.yml`, qui les attache aux groupes projetes +# depuis l'annuaire. Ils vivaient pourtant dans `rbac-oidc.yml`, execute APRES — et le +# defaut est reste invisible aussi longtemps que le realm a existe avec ses roles deja +# crees par un passage precedent. +# +# La premiere reconstruction from-zero l'a fait tomber au premier essai : realm neuf, et +# `groupes-ldap` a tente d'attacher `grafana-admin` a un groupe alors que seuls les roles +# integres (`offline_access`, `uma_authorization`, `default-roles-*`) existaient. +# +# Les deux autres etapes de `rbac-oidc.yml` restent APRES `clients-oidc.yml` : elles +# posent un mapper sur les clients et assignent des roles a des utilisateurs. Trois +# dependances distinctes, trois moments distincts — les melanger etait le defaut. +- name: Assurer les roles de realm (kcadm, idempotent) + ansible.builtin.shell: + executable: /bin/bash + cmd: | + set -euo pipefail + KC={{ serveur_keycloak_home }}/bin/kcadm.sh + "$KC" config credentials --server http://localhost:8080 --realm master \ + --user {{ serveur_keycloak_admin_user }} --password "$KC_ADMIN_PW" >/dev/null + if "$KC" get roles/{{ item }} -r {{ serveur_keycloak_realm }} >/dev/null 2>&1; then + echo SETOPS_OK + else + "$KC" create roles -r {{ serveur_keycloak_realm }} -s name={{ item }} >/dev/null + echo SETOPS_CHANGED + fi + environment: + KC_ADMIN_PW: "{{ serveur_keycloak_admin_password }}" + loop: "{{ serveur_keycloak_realm_roles }}" + register: serveur_keycloak_role_reg + changed_when: "'SETOPS_CHANGED' in serveur_keycloak_role_reg.stdout" + no_log: true + when: + - not ansible_check_mode + - serveur_keycloak_realm_roles | length > 0