如何在Terraform中为OCI IAM组批量添加已有用户
实现方案
你需要先通过Terraform数据源拉取租户下已存在的所有用户的映射关系,再把组与用户的一对多关系扁平化,最后遍历创建用户组关联资源即可,完整配置如下:
步骤1:添加数据源拉取已有用户信息
先通过OCI官方数据源获取租户下所有已创建的用户,生成用户名到用户OCID的映射,方便后续直接调用:
# 拉取租户下所有已存在的IAM用户 data "oci_identity_users" "all_users" { compartment_id = var.tenancy_ocid } # 生成本地映射:key为用户名,value为用户OCID locals { user_map = { for user in data.oci_identity_users.all_users.users : user.name => user.id } }
步骤2:生成扁平化的组-用户配对列表
把你定义的iam_group变量中,每个组对应的多个用户拆分成独立的一一对应关系,避免一对多遍历冲突:
locals { group_user_pairs = flatten([ for group_key, group_info in var.iam_group : [ for user_name in group_info.user_list : { group_key = group_key group_id = oci_identity_group.this[group_key].id user_name = user_name user_id = local.user_map[user_name] } ] ]) }
步骤3:编写用户组成员关联资源
遍历上一步生成的配对列表创建关联资源,使用组key+用户名作为唯一标识避免资源实例重复:
resource "oci_identity_user_group_membership" "test_user_group_membership" { for_each = { for pair in local.group_user_pairs : "${pair.group_key}/${pair.user_name}" => pair } compartment_id = var.tenancy_ocid group_id = each.value.group_id user_id = each.value.user_id }
可选优化说明
如果你不确定user_list中的用户是否全部在租户下存在,可以将local.user_map[user_name]替换为lookup(local.user_map, user_name, null),同时添加precondition规则提前校验抛出友好错误,避免运行时异常。
内容的提问来源于stack exchange,提问作者magic
相关产品推荐
相关产品推荐

