--- - name: SSO OIDC (occ, en www-data avec TLS PG) become: true become_user: "{{ serveur_nextcloud_utilisateur }}" environment: PGSSLMODE: "{{ serveur_nextcloud_pg_sslmode }}" PGSSLROOTCERT: "{{ serveur_nextcloud_ca_racine }}" when: not ansible_check_mode block: - name: Installer + activer l'app user_oidc (idempotent) ansible.builtin.shell: executable: /bin/bash cmd: | set -eo pipefail OCC="php {{ serveur_nextcloud_racine }}/occ" if $OCC app:list | grep -qw user_oidc; then echo SETOPS_OK; else $OCC app:install user_oidc && echo SETOPS_CHANGED; fi register: serveur_nextcloud_oidc_app changed_when: "'SETOPS_CHANGED' in serveur_nextcloud_oidc_app.stdout" - name: Ne plus annoncer le formulaire de connexion locale # Masquage, pas fermeture : `?direct=1` reste le chemin de secours documente par # l'amont. Voir serveur_nextcloud_connexion_locale dans defaults/main.yml. ansible.builtin.command: argv: - php - "{{ serveur_nextcloud_racine }}/occ" - "config:system:set" - "hide_login_form" - "--type=boolean" - "--value={{ 'false' if serveur_nextcloud_connexion_locale | bool else 'true' }}" changed_when: false - name: Configurer le fournisseur OIDC Keycloak (upsert idempotent) ansible.builtin.command: argv: - php - "{{ serveur_nextcloud_racine }}/occ" - "user_oidc:provider" - "{{ serveur_nextcloud_oidc_nom }}" - "--clientid={{ serveur_nextcloud_oidc_client_id }}" - "--clientsecret={{ serveur_nextcloud_oidc_client_secret }}" - "--discoveryuri={{ serveur_nextcloud_oidc_discovery }}" - "--scope=openid email profile" - "--mapping-uid=preferred_username" - "--mapping-email=email" - "--mapping-display-name=name" - "--mapping-groups={{ serveur_nextcloud_oidc_groupe_claim }}" - "--group-provisioning=1" - "--unique-uid=0" changed_when: false no_log: true # Les groupes projetes depuis LDAP arrivent dans Nextcloud, mais y etre membre # ne donne aucun pouvoir : l'administration est un GROUPE NEXTCLOUD nomme # `admin`. On y verse le groupe d'habilitation, une fois qu'il existe. # # Sans cela, `meta/acces.yml` restait `porte_par: aucun` et l'administration # passait par le compte local de secours — ce qui contredit « une identite, un # mot de passe » (2026-08-07). - name: Verser le groupe d'administration dans le groupe `admin` de Nextcloud ansible.builtin.shell: executable: /bin/bash cmd: | set -eo pipefail OCC="php {{ serveur_nextcloud_racine }}/occ" G="{{ serveur_nextcloud_oidc_groupe_admin }}" # Le groupe n'existe qu'apres la premiere connexion d'un membre : son # absence n'est donc PAS une erreur au premier deploiement. if ! $OCC group:list --output=json | grep -q "\"$G\""; then echo "SETOPS_OK (groupe '$G' pas encore provisionne — a la premiere connexion)" exit 0 fi CHANGED=0 for U in $($OCC group:list --output=json | python3 -c " import json,sys print(' '.join((json.load(sys.stdin).get('$G') or [])))"); do if ! $OCC group:list --output=json | python3 -c " import json,sys sys.exit(0 if '$U' in (json.load(sys.stdin).get('admin') or []) else 1)"; then $OCC group:adduser admin "$U" >/dev/null && CHANGED=1 fi done [ "$CHANGED" = 1 ] && echo SETOPS_CHANGED || echo SETOPS_OK register: serveur_nextcloud_grp_admin changed_when: "'SETOPS_CHANGED' in serveur_nextcloud_grp_admin.stdout" when: serveur_nextcloud_oidc_groupe_admin | length > 0