You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform中匹配组变量时如何调用对应成员列表

解决Terraform Keycloak组分配用户的问题

核心问题修正点

  1. Realm ID引用错误:原代码中keycloak_group和keycloak_user的realm_id直接使用字符串名称,Keycloak Provider需要的是Realm资源的ID值,而非名称。
  2. Group Memberships的成员值类型错误:keycloak_group_memberships的members字段需要用户ID,而非用户名,需建立用户名到用户ID的映射。
  3. 关联组与成员列表:需要将组资源与变量中定义的成员列表正确关联,避免硬编码。

修改后的完整代码

本地值定义(新增)

locals {
  # 建立用户名到用户ID的映射,用于将成员用户名转换为Keycloak识别的用户ID
  user_username_to_id = {
    for k, user in keycloak_user.user : user.username => user.id
  }
}

修正Realm、Group、User资源

resource "keycloak_realm" "realm" {
  for_each = var.realms
  realm    = each.value
}

resource "keycloak_group" "group" {
  for_each = var.mrpc-groups

  # 引用Realm资源的ID,而非字符串名称
  realm_id = keycloak_realm.realm[each.value.realm].id
  name     = each.value.name

  depends_on = [keycloak_realm.realm]
}

resource "keycloak_user" "user" {
  for_each = var.mrpc-users

  # 引用Realm资源的ID,而非字符串名称
  realm_id   = keycloak_realm.realm[each.value.realm].id
  username   = each.value.username
  email      = each.value.email
  first_name = each.value.first_name
  last_name  = each.value.last_name
}

修正Group Memberships资源

resource "keycloak_group_memberships" "group_members" {
  # 直接遍历groups变量,每个条目可直接获取对应成员列表
  for_each = var.mrpc-groups

  realm_id = keycloak_realm.realm[each.value.realm].id
  # 引用对应组资源的ID,而非组名称
  group_id = keycloak_group.group[each.key].id

  # 将变量中的成员用户名转换为用户ID
  members = [
    for username in each.value.members : local.user_username_to_id[username]
  ]

  # 确保用户资源创建完成后再分配组
  depends_on = [keycloak_user.user]
}

说明

  • 本地值user_username_to_id通过for表达式遍历用户资源,自动建立用户名到ID的映射,无需手动维护。
  • keycloak_group_memberships遍历var.mrpc-groups,每个条目直接关联变量中定义的成员列表,避免额外的查找逻辑。
  • 所有realm_id和group_id均引用对应资源的ID属性,符合Keycloak Provider的要求,避免因名称重复或系统内部ID不匹配导致的错误。

内容的提问来源于stack exchange,提问作者martincarpenter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 10:50:24