--- # Icinga Web 2 (UI native Icinga) + module IcingaDB, sur le nœud de supervision. # App PHP servie par nginx local + php-fpm ; l'edge nginx proxifie par nom. # Auth LDAP direct (OpenLDAP) — icingaweb2 n'a pas d'OIDC natif ; SSO via proxy = raffinement. serveur_icingaweb2_paquets: - icingadb-web # module IcingaDB (tire icingaweb2 en dépendance) - icingaweb2-module-businessprocess # module BPM (vues d'impact métier) - php8.4-fpm - php8.4-cli - php8.4-pgsql - php8.4-ldap - php8.4-intl - php8.4-gd - php8.4-curl - php8.4-xml - php8.4-mbstring - nginx serveur_icingaweb2_php_fpm_service: "php8.4-fpm" serveur_icingaweb2_php_fpm_socket: "/run/php/php8.4-fpm.sock" serveur_icingaweb2_nginx_service: "nginx" # Publication : nginx LOCAL sur ce port ; l'edge proxifie icinga. ici. serveur_icingaweb2_hostname: "icinga.{{ domaine_interne }}" serveur_icingaweb2_http_port: 8080 serveur_icingaweb2_docroot: "/usr/share/icingaweb2/public" serveur_icingaweb2_config_dir: "/etc/icingaweb2" # Base IcingaDB (via le registre — même consommateur que le moteur). serveur_icingaweb2_icinga_groupe: "serveur_icinga" # Redis IcingaDB (local au nœud de supervision). serveur_icingaweb2_redis_host: "127.0.0.1" serveur_icingaweb2_redis_port: 6380 # 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_user_class: "inetOrgPerson" serveur_icingaweb2_ldap_user_attr: "uid" # Qui reçoit le rôle Administrateur (liste d'uid séparés par des virgules). # # /!\ NOMMER DES PERSONNES contredit D-66 : révoquer quelqu'un demande alors un # déploiement, et la liste vieillit sans que rien ne le signale. Icinga Web 2 sait # lire un groupe d'annuaire (backend LDAP de type `group`) — c'est là qu'il faut # aller. Voir roles/serveur_icingaweb2/meta/acces.yml. # # En attendant, le défaut suit l'`uid` d'amorçage plutôt qu'un compte de test : # `testmail` était codé en dur et n'existe dans aucune instance — le seul # administrateur déclaré était donc un utilisateur inexistant (2026-08-07). # Repli seulement, et VIDE par defaut : l'habilitation passe par le GROUPE # (`serveur_icingaweb2_groupe_admin`). Le renseigner nomme des personnes, ce que # D-66 interdit — a n'utiliser que pour un depannage. serveur_icingaweb2_admins: "" # Habilitation par groupe d'annuaire. Le schema est celui que `amorcage_acces` pose : # des `groupOfNames` dont les membres sont des DN. serveur_icingaweb2_groupe_admin: "{{ amorcage_acces_groupe | default('sysadmin') }}" serveur_icingaweb2_groupe_class: "groupOfNames" serveur_icingaweb2_groupe_membre_attr: "member" serveur_icingaweb2_groupes_dn: "ou=groups,{{ resoudre_annuaire_base_dn | default('') }}" # Backend d'authentification : "ldap" (direct) ou "external" (utilisateur fourni par une # passerelle SSO devant, ex. oauth2-proxy → Keycloak). En "external", nginx doit poser REMOTE_USER. # TROIS MODES D'AUTHENTIFICATION, ET LE TROISIEME EST NE POUR LE SITE (2026-09-14). # # `ldap` — connexion directe a l'annuaire. Icinga Web 2 n'a pas d'OIDC natif. # `external` — une passerelle SSO devant (oauth2-proxy -> Keycloak) pose `REMOTE_USER`, # et un backend LDAP sert a resoudre les GROUPES. # `db` — ni annuaire ni passerelle : Icinga Web 2 gere ses comptes LUI-MEME, # dans sa propre base, avec sa propre page de connexion. # # POURQUOI `db` EXISTE. Un SITE n'a ni LDAP ni Keycloak — ce sont des services # d'ecosysteme, et l'hebergeur n'en est pas un. Sans ce mode, la console de supervision # du site etait impossible : le plan declarait `serveur_icinga` sans `serveur_icingaweb2`, # et 88 verdicts se calculaient sans que personne puisse les LIRE. # # PREMIERE ECRITURE, ET ELLE ETAIT DE TROP (corrigee le 2026-09-15). Ce mode s'appelait # `locale` et posait un `auth_basic` nginx devant le backend `external` : nginx demandait # le mot de passe et l'application croyait le nom qu'il lui passait. Ca marchait, et ca # reinventait une page de connexion devant une application qui en a une. # # L'exploitant l'a dit en une phrase : *« Icinga Web 2 permet nativement de gerer des # comptes ; ce genre d'intervention n'est pertinente que pour integrer Icinga a Keycloak # chez les tenants. »* Un vestibule n'a de sens que devant une application qui ne sait # pas s'authentifier — et celle-ci sait. # # CE QUE LE MODE NATIF DONNE EN PLUS : la gestion des comptes DANS l'interface. Creer, # desactiver, changer un mot de passe ne demande plus un deploiement ni un passage par la # voute. Et l'habilitation cesse de nommer une personne en dur dans `roles.ini` : les # GROUPES d'Icinga Web 2 existent aussi en base. serveur_icingaweb2_auth: "ldap" # Variable nginx d'où vient REMOTE_USER. En SSO : l'en-tête d'oauth2-proxy. serveur_icingaweb2_remote_user: "$remote_user" # Préfixe d'écoute nginx local ("" = toutes interfaces ; "127.0.0.1:" = local, derrière la passerelle). serveur_icingaweb2_nginx_bind: "" # Modules icingaweb2 à activer. serveur_icingaweb2_modules: - icingadb - businessprocess # Processus métier (BPM) à semer, en IaC (nom -> contenu du .conf). Vide par défaut : # les processus sont normalement édités via l'UI. Un contenu ici est géré par Ansible. serveur_icingaweb2_bpm_processes: {} # LES CODES QU'UNE CONSOLE SAINE PEUT RENDRE A UNE REQUETE NON AUTHENTIFIEE. # # 200 quand la racine se sert, 302 quand elle renvoie vers le formulaire de connexion, # 401/403 quand une passerelle SSO se tient devant. Les quatre disent la meme chose : la # pile PHP est vivante. Ce qu'ils excluent, c'est le 502 et le 504 — php-fpm mort ou # bloque — et l'absence de reponse, qui est le nginx local tombe. serveur_icingaweb2_sonde_codes: "HTTP/1.1 200,HTTP/1.1 302,HTTP/1.1 401,HTTP/1.1 403" # CE QUE LA VIGIE LIT, EPROUVE AVEC SES PROPRES IDENTIFIANTS (2026-09-28). La table que la # sonde interroge dans la base du moteur, au travers de la ressource que la vigie utilise. # Mise en defaut PAR PARAMETRE : une table qui n'existe pas. serveur_icingaweb2_sonde_table: "host" # --- MODE `db` : le compte d'amorcage de la console ------------------------------------ # # UN SEUL COMPTE EST POSE PAR LE MOTEUR, et c'est voulu : celui qui permet d'entrer la # premiere fois. Les suivants se creent DANS l'interface, par quelqu'un qui a une tete et # un contexte — pas par un deploiement. # # LE MOT DE PASSE VIENT DE LA VOUTE. Vide, le role REFUSE de deployer en mode `db` : # degrader, jamais deviner, et surtout jamais un mot de passe par defaut sur une console # qui montre l'etat de toute une fabric. serveur_icingaweb2_admin_utilisateur: "icinga-admin" serveur_icingaweb2_admin_motdepasse: "{{ vault_icingaweb2_admin | default('') }}" # LE SCHEMA DES TABLES DE COMPTES, livre par le paquet. On le charge UNE FOIS — la # presence de `icingaweb_user` sert de temoin, parce que rejouer ce fichier sur une base # deja peuplee echouerait sur les objets existants. serveur_icingaweb2_schema: "/usr/share/icingaweb2/schema/pgsql.schema.sql" # TLS VERS POSTGRESQL, DERIVE DE CE QUE SERT LE SERVEUR. Voir `resoudre_base` et P78. # # P78 nommait ce role comme « sans reglage TLS » — c'etait vrai et sans consequence tant # qu'il ne tournait nulle part face a un `hostssl`. Au site, il en trouve un. serveur_icingaweb2_db_sslmode: >- {{ 'verify-full' if (resoudre_base_db_tls_force | default(false)) else '' }} serveur_icingaweb2_db_sslrootcert: "/etc/step/certs/root_ca.crt"