digitalboard.core/roles/keycloak
Simon Bärlocher 3236ca332f
docs(collection): document all roles and fix metadata drift
Replace ansible-galaxy init placeholders across the collection and
correct documentation that drifted from the code, after a multi-agent
review of every role README against its defaults, tasks and templates.

Collection level:
- README: role table for all 16 roles, requirements and role-ordering
- galaxy.yml: declare community.docker and community.general deps,
  real description/tags/urls; normalize license to MIT-0
- meta/runtime.yml: requires_ansible '>=2.15.0'
- plugins/README: document the homarr_layout filter and
  garage_credentials lookup instead of scaffold boilerplate

Per-role meta/main.yml and README for the placeholder roles
(389ds, authentik, authentik_outpost_ldap, base, collabora, drawio,
garage, homarr, httpbin, keycloak, nextcloud, opencloud, traefik).

Correctness fixes found during review:
- keycloak: wrong domain default, drop invented keycloak_cert_resolver,
  document the provisioning feature
- garage: root_domain is .s3.<first-entry>, not the bare domain
- opnform: jwt/front_api secrets use `openssl rand -hex 32`; align the
  validation fail_msg in tasks/main.yml accordingly
- send: S3 example references garage_s3_domains[0] (was singular)
- opencloud: document required opencloud_wopi_domain

License normalized to MIT-0 across galaxy.yml, role meta and READMEs to
match the SPDX headers.
2026-05-27 23:12:24 +02:00
..
defaults feat: add 389ds ldap backend to keycloak 2026-03-13 10:58:40 +01:00
handlers chore: add basic keycloak service 2025-11-07 14:16:31 +01:00
meta docs(collection): document all roles and fix metadata drift 2026-05-27 23:12:24 +02:00
tasks feat: opencloud group provisioning via oidc 2026-03-13 16:43:02 +01:00
templates feat: add 389ds ldap backend to keycloak 2026-03-13 10:58:40 +01:00
tests chore: add basic keycloak service 2025-11-07 14:16:31 +01:00
vars chore: add basic keycloak service 2025-11-07 14:16:31 +01:00
README.md docs(collection): document all roles and fix metadata drift 2026-05-27 23:12:24 +02:00

Keycloak

Ansible role to deploy Keycloak with a PostgreSQL backend via Docker Compose, published behind Traefik. Optionally provisions realm resources (groups, users, OIDC clients, identity providers, LDAP user federations) through the community.general Keycloak modules.

Requirements

  • Docker and Docker Compose on the target host (e.g. via digitalboard.core.base)
  • Ansible collections: community.docker, and community.general when keycloak_provisioning_enabled is true
  • Traefik reverse proxy with the proxy network already created (for external access)

Role variables

Key variables from defaults/main.yml:

Base configuration

Variable Default Description
docker_compose_base_dir /etc/docker/compose Base dir for Compose projects.
docker_volume_base_dir /srv/data Base dir for persistent volumes.
keycloak_service_name keycloak Compose/service name; builds the per-service paths.

Keycloak

Variable Default Description
keycloak_domain keycloak.local.test Host rule and KC_HOSTNAME.
keycloak_image quay.io/keycloak/keycloak:24.0.1 Keycloak image.
keycloak_port 8080 Internal HTTP port advertised to Traefik.
keycloak_admin_user admin Bootstrap admin user.
keycloak_admin_password changeme Admin password — override this.
keycloak_log_level INFO KC_LOG_LEVEL.
keycloak_proxy_mode edge KC_PROXY mode.
keycloak_gzip_enabled false Toggle Keycloak GZIP response encoding.
keycloak_truststore_certificates [] Host PEM paths mounted into the truststore (KC_TRUSTSTORE_PATHS).
keycloak_extra_hosts [] Extra host:ip entries for the container.

PostgreSQL

Variable Default Description
keycloak_postgres_image postgres:15 PostgreSQL image.
keycloak_postgres_db keycloak Database name.
keycloak_postgres_user keycloak Database user.
keycloak_postgres_password changeme Database password — override this.

Traefik

Variable Default Description
keycloak_traefik_network proxy External Traefik network.
keycloak_backend_network backend Internal network to PostgreSQL.
keycloak_use_ssl true Route on websecure with tls=true instead of web.

TLS is requested from Traefik via tls=true; the role does not set a certificate resolver, so Traefik issues/serves the certificate according to its own configuration.

Provisioning (optional)

Provisioning runs only when keycloak_provisioning_enabled is true. The tasks wait for the /health/ready endpoint and then call the community.general.keycloak_* modules, delegated to localhost against keycloak_auth_url (derived from keycloak_use_ssl + keycloak_domain).

Variable Default Description
keycloak_provisioning_enabled false Enable realm provisioning.
keycloak_realm default Target realm; created unless master.
keycloak_realm_display_name Default Realm Realm display name.
keycloak_auth_url derived API base URL for provisioning.
keycloak_groups [] Groups to create.
keycloak_local_users [] Local users to create.
keycloak_oidc_clients [] OIDC clients to create.
keycloak_identity_providers [] Identity providers (e.g. Entra ID).
keycloak_user_federations [] LDAP user federations.
keycloak_removed_users [] Usernames to delete.
keycloak_removed_groups [] Group names to delete.
keycloak_removed_clients [] Client IDs to delete.
keycloak_removed_identity_providers [] IdP aliases to delete.
keycloak_removed_user_federations [] Federation names to delete.

See defaults/main.yml for the full entry shape of each list.

Dependencies

This role requires the Traefik reverse proxy to be configured and the proxy network to be created beforehand (it is referenced as an external network in the Compose file). The backend network is created by the Compose project itself.

Example playbook

- hosts: backend_servers
  roles:
    - role: digitalboard.core.keycloak
      vars:
        keycloak_domain: "auth.example.com"
        keycloak_admin_password: "{{ vault_keycloak_admin_password }}"
        keycloak_postgres_password: "{{ vault_keycloak_pg_password }}"
        keycloak_provisioning_enabled: true
        keycloak_oidc_clients:
          - client_id: nextcloud
            name: "Nextcloud"
            client_secret: "{{ vault_nextcloud_client_secret }}"
            redirect_uris:
              - "https://nextcloud.example.com/apps/user_oidc/code"

License

MIT-0