From 1f1b722a00a3dce3f78ba0e1bc694a8e0ebdbf1b Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Fri, 3 Jul 2026 23:24:38 -0400 Subject: [PATCH] =?UTF-8?q?Binding=20annuaire=20compl=C3=A9t=C3=A9=20:=20i?= =?UTF-8?q?cingaweb2=20+=20client=5Fldap=20=E2=86=92=20resoudre=5Fannuaire?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fin des 2 loose ends : icingaweb2 (LDAP dormant en mode SSO) résout via resoudre_annuaire (redéploiement changed=0, SSO intact) ; client_ldap (SSSD, dormant) ne pointe plus sur un idm-01 périmé. Plus aucun rôle ne code en dur l'hôte d'annuaire — un seul point de vérité. Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 8 ++++++-- roles/client_ldap/defaults/main.yml | 5 +++-- roles/client_ldap/tasks/main.yml | 9 +++++++++ roles/serveur_icingaweb2/defaults/main.yml | 9 +++------ roles/serveur_icingaweb2/tasks/main.yml | 14 ++++++++++++++ 5 files changed, 35 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04d0878..500ca0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,8 +44,12 @@ déréférencé, `no_log`). **Migrés + prouvés (config neutre, `changed=0`)** : `serveur_keycloak` (fédération LDAP — testmail token HTTP 200), `serveur_dovecot` + `serveur_postfix` (flux courriel Postfix→LDAP→LMTP→Dovecot **livré de bout en bout**). Piège appris : les *defaults* d'un rôle inclus - ne persistent pas hors de son exécution — publier via `set_fact`. Reste : les defaults LDAP dormants - d'`icingaweb2` (mode SSO, LDAP inutilisé) et `client_ldap` (référence périmée `idm-01`). + ne persistent pas hors de son exécution — publier via `set_fact`. +- **Binding annuaire complété — `icingaweb2` + `client_ldap` migrés vers `resoudre_annuaire`.** Fin des + 2 loose ends : `serveur_icingaweb2` (connexion LDAP dormante en mode SSO) résout via + `resoudre_annuaire` (redéploiement `changed=0`, SSO intact) ; `client_ldap` (SSSD, dormant) ne pointe + plus sur un `idm-01` périmé. **Plus AUCUN rôle ne code en dur l'hôte d'annuaire** — un seul point de + vérité (`resoudre_annuaire`). - **Rôle `serveur_oauth2_proxy` — passerelle SSO OIDC générique (Keycloak) + Icinga Web 2 au SSO.** oauth2-proxy (v7.15.3, binaire GitHub) place Keycloak **devant** n'importe quelle app sans OIDC natif : elle reçoit l'utilisateur authentifié via en-tête, en auth `external`. Rôle paramétrable diff --git a/roles/client_ldap/defaults/main.yml b/roles/client_ldap/defaults/main.yml index a7f8512..9d06eb9 100644 --- a/roles/client_ldap/defaults/main.yml +++ b/roles/client_ldap/defaults/main.yml @@ -9,8 +9,9 @@ client_ldap_paquets: client_ldap_service: "sssd" client_ldap_domaine: "{{ domaine_interne.split('.') | first }}" -client_ldap_uri: "ldap://idm-01.{{ domaine_interne }}" -client_ldap_base_dn: "dc={{ domaine_interne.split('.') | join(',dc=') }}" +# uri + base_dn : fournis par le rôle partagé resoudre_annuaire (tasks « Adopter »). +# Rôle DORMANT (login LDAP niveau OS via SSSD, non câblé). L'activer requiert client_pki +# (confiance step_ca pour LDAPS) et client_ldap_tls_reqcert: "demand". # Bind de lecture. Vide => bind anonyme (lecture publique de l'annuaire). client_ldap_bind_dn: "" diff --git a/roles/client_ldap/tasks/main.yml b/roles/client_ldap/tasks/main.yml index 425a58b..5bf0eef 100644 --- a/roles/client_ldap/tasks/main.yml +++ b/roles/client_ldap/tasks/main.yml @@ -1,4 +1,13 @@ --- +- name: Résoudre l'annuaire (rôle partagé) + ansible.builtin.include_role: + name: resoudre_annuaire + +- name: Adopter la connexion annuaire pour SSSD + ansible.builtin.set_fact: + client_ldap_uri: "{{ resoudre_annuaire_uri }}" + client_ldap_base_dn: "{{ resoudre_annuaire_base_dn }}" + - name: Installer SSSD et les modules LDAP ansible.builtin.apt: name: "{{ client_ldap_paquets }}" diff --git a/roles/serveur_icingaweb2/defaults/main.yml b/roles/serveur_icingaweb2/defaults/main.yml index d0b267c..f0f0fc7 100644 --- a/roles/serveur_icingaweb2/defaults/main.yml +++ b/roles/serveur_icingaweb2/defaults/main.yml @@ -32,13 +32,10 @@ serveur_icingaweb2_icinga_groupe: "serveur_icinga" serveur_icingaweb2_redis_host: "127.0.0.1" serveur_icingaweb2_redis_port: 6380 -# Authentification LDAP (OpenLDAP, LDAPS via la confiance step_ca / client_pki). -serveur_icingaweb2_ldap_url: "ldaps://id-ldap-01.{{ domaine_interne }}" +# Authentification LDAP (OpenLDAP, LDAPS). La connexion (url, base, users_dn, bind_dn, +# bind_password) est fournie par le rôle partagé resoudre_annuaire (voir tasks « Adopter la +# connexion annuaire »). Utilisée seulement en mode auth "ldap" ; en SSO, résolue mais inutilisée. serveur_icingaweb2_ldap_port: 636 -serveur_icingaweb2_ldap_base: "dc={{ domaine_interne.split('.') | join(',dc=') }}" -serveur_icingaweb2_ldap_users_dn: "ou=people,dc={{ domaine_interne.split('.') | join(',dc=') }}" -serveur_icingaweb2_ldap_bind_dn: "cn=admin,dc={{ domaine_interne.split('.') | join(',dc=') }}" -serveur_icingaweb2_ldap_bind_password: "{{ vault_openldap_admin | default('') }}" serveur_icingaweb2_ldap_user_class: "inetOrgPerson" serveur_icingaweb2_ldap_user_attr: "uid" diff --git a/roles/serveur_icingaweb2/tasks/main.yml b/roles/serveur_icingaweb2/tasks/main.yml index 9834f6f..3cb1e75 100644 --- a/roles/serveur_icingaweb2/tasks/main.yml +++ b/roles/serveur_icingaweb2/tasks/main.yml @@ -5,6 +5,20 @@ vars: resoudre_base_groupe: "{{ serveur_icingaweb2_icinga_groupe }}" +- name: Résoudre l'annuaire (rôle partagé) + ansible.builtin.include_role: + name: resoudre_annuaire + +- name: Adopter la connexion annuaire pour Icinga Web 2 + ansible.builtin.set_fact: + serveur_icingaweb2_ldap_url: "{{ resoudre_annuaire_uri }}" + serveur_icingaweb2_ldap_port: "{{ resoudre_annuaire_port }}" + serveur_icingaweb2_ldap_base: "{{ resoudre_annuaire_base_dn }}" + serveur_icingaweb2_ldap_users_dn: "{{ resoudre_annuaire_users_dn }}" + serveur_icingaweb2_ldap_bind_dn: "{{ resoudre_annuaire_bind_dn }}" + serveur_icingaweb2_ldap_bind_password: "{{ resoudre_annuaire_bind_password }}" + no_log: true + - name: Installer Icinga Web 2 + module IcingaDB + PHP-FPM + nginx ansible.builtin.apt: name: "{{ serveur_icingaweb2_paquets }}"