terraform { required_providers { helm = { source = "hashicorp/helm" version = "~> 2.11.0" } kubernetes = { source = "hashicorp/kubernetes" version = "~> 2.23.0" } keycloak = { source = "mrparkers/keycloak" version = "~> 4.3.1" } proxmox = { source = "telmate/proxmox" version = "~> 2.9.8" } guacamole = { source = "techBeck03/guacamole" version = "~> 1.4.1" } freeipa = { source = "rework-space-com/freeipa" version = "4.0.0" } ldap = { source = "l-with/ldap" version = ">= 0.4" } } backend "kubernetes" { secret_suffix = "tfstate" config_path = "~/.kube/config" namespace = "dan-terraform" } } provider "kubernetes" { config_path = "~/.kube/config" } provider "helm" { kubernetes { config_path = "~/.kube/config" } } provider "keycloak" { client_id = "terraform" client_secret = var.keycloak_client_secret url = "https://keycloak.${var.domain_suffix}" } provider "guacamole" { url = "https://guac.${var.domain_suffix}/" # token = var.guacamole_token # data_source = var.guacamole_datasource username = "guacadmin" password = "guacadmin" } provider "proxmox" { pm_api_url = var.proxmox_api_url pm_api_token_id = var.proxmox_token_id pm_api_token_secret = var.proxmox_token pm_tls_insecure = true } provider "freeipa" { host = "${helm_release.freeipa.name}.${var.domain_suffix}" username = "admin" password = var.freeipa_admin_password insecure = true } provider "ldap" { alias = "ldap_provisioner" host = "${helm_release.freeipa.name}.${var.domain_suffix}" bind_user = "admin" bind_password = "${var.freeipa_ds_password}" port = 389 } resource "helm_release" "keycloak" { name = "keycloak" namespace = var.keycloak_namespace repository = "https://charts.bitnami.com/bitnami/" chart = "keycloak" create_namespace = true values = [ <<-EOT auth: adminPassword: ${var.keycloak_admin_pass} adminUser: admin global: storageClass: ${var.storageclass} ingress: annotations: cert-manager.io/cluster-issuer: letsencrypt-prod traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd enabled: true hostname: keycloak.${var.domain_suffix} tls: true postgresql: auth: password: ${var.postgres_password} proxy: edge metrics: enabled: true EOT ] } resource "keycloak_realm" "realm" { realm = var.keycloak_realm display_name = var.keycloak_realm_display_name enabled = true default_signature_algorithm = "RS256" } resource "keycloak_user" "initial_keycloak_user" { realm_id = keycloak_realm.realm.id username = var.keycloak_user.username enabled = true email = var.keycloak_user.email first_name = var.keycloak_user.firstname last_name = var.keycloak_user.lastname initial_password { value = var.keycloak_user.password temporary = false } } resource "keycloak_group" "admin_group" { realm_id = keycloak_realm.realm.id name = "Admins" } resource "keycloak_user_groups" "initial_user_in_admin_group" { exhaustive = false realm_id = keycloak_realm.realm.id user_id = keycloak_user.initial_keycloak_user.id group_ids = [ keycloak_group.admin_group.id ] } resource "keycloak_openid_client_scope" "openid_client_scope" { realm_id = keycloak_realm.realm.id name = "groups" description = "When requested, this scope will map a user's group memberships to a claim" include_in_token_scope = true gui_order = 1 } resource "keycloak_openid_client" "proxmox_client" { realm_id = keycloak_realm.realm.id client_id = "dc-proxmox1" enabled = true access_type = "CONFIDENTIAL" standard_flow_enabled = true implicit_flow_enabled = true client_secret = var.keycloak_proxmox_secret valid_redirect_uris = [ "https://172.29.7.12:8006", "https://172.29.7.15:8006" ] } resource "keycloak_openid_client" "gitea_client" { realm_id = keycloak_realm.realm.id client_id = "gitea" enabled = true access_type = "CONFIDENTIAL" standard_flow_enabled = true implicit_flow_enabled = true client_secret = var.keycloak_gitea_secret valid_redirect_uris = [ "https://git.${var.domain_suffix}/*" ] } resource "helm_release" "gitea" { name = "gitea" repository = "https://dl.gitea.com/charts/" chart = "gitea" namespace = var.gitea_namespace create_namespace = true values = [ <<-EOT gitea: oauth: - autoDiscoverUrl: https://keycloak.${var.domain_suffix}/realms/${keycloak_realm.realm.realm}/.well-known/openid-configuration key: ${keycloak_openid_client.gitea_client.client_id} name: md1clv.im provider: openidConnect secret: ${keycloak_openid_client.gitea_client.client_secret} global: storageClass: ${var.storageclass} ingress: annotations: traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd cert-manager.io/cluster-issuer: letsencrypt-prod enabled: true hosts: - host: git.${var.domain_suffix} paths: - path: / pathType: Prefix tls: - hosts: - git.${var.domain_suffix} secretName: tls-gitea persistence: enabled: true storageClass: ${var.storageclass} EOT ] } resource "keycloak_openid_client" "guac_client" { realm_id = keycloak_realm.realm.id client_id = "guac" enabled = true access_type = "CONFIDENTIAL" standard_flow_enabled = true implicit_flow_enabled = true valid_redirect_uris = [ "https://guac.${var.domain_suffix}/*" ] } resource "keycloak_openid_group_membership_protocol_mapper" "guac_group_membership_mapper" { realm_id = keycloak_realm.realm.id name = "groups" claim_name = "groups" client_id = keycloak_openid_client.guac_client.id full_path = false } resource "random_password" "guac_db_pw" { length = 16 special = false } resource "random_password" "guac_db_admin_pw" { length = 16 special = false } resource "helm_release" "guacpg" { name = "guacpg" namespace = var.guac_namespace repository = "https://charts.bitnami.com/bitnami/" chart = "postgresql" create_namespace = true values = [ < x } name = each.value.name parent_identifier = guacamole_connection_group.routers.identifier parameters { hostname = each.value.default_ipv4_address username = "vyos" private_key = var.ssh_private_key } }