如何用单个Terraform资源块批量创建多个实例关联的Okta用户组
实现方案
核心思路是先将local.instances中嵌套的groups数组展开为每个用户组对应一条独立记录的扁平映射,再通过单个资源块的for_each遍历即可,不需要拆分多个资源块。
第一步:构造扁平的组映射
在locals块中新增处理后的组结构,用flatten展开嵌套层级:
locals { instances = [ { instance = "test1" baseUrl = "url" subDomain = "sd" groups = [ "app1", "app2", "app3", ] }, { instance = "test2" baseUrl = "url2" subDomain = "sd2" groups = [ "t1", "t2", "t3", ] }, ] # 展开嵌套结构,每个组对应一条独立记录 all_groups = flatten([ for instance in local.instances : [ for group_name in instance.groups : { instance_name = instance.instance group_name = group_name base_url = instance.baseUrl sub_domain = instance.subDomain # 构造唯一键,避免不同实例下同名组冲突 unique_key = "${instance.instance}-${group_name}" } ] ]) # 转换为for_each需要的映射结构 group_map = { for item in local.all_groups : item.unique_key => item } }
第二步:单个资源块遍历创建所有组
resource "okta_group" "all_press" { for_each = local.group_map name = each.value.group_name # 后续如果需要关联实例参数,可直接取each.value.base_url、each.value.sub_domain等属性 }
补充说明
- 构造
unique_key作为映射的键是为了保证每个组的索引唯一,避免不同实例下存在同名组时出现资源ID冲突 - 所有实例下的组都会通过
okta_group.all_press这一个资源块创建,后续新增实例或组只需要修改local.instances即可,不需要新增资源块 - 访问创建后的资源时可以用
okta_group.all_press["test1-app1"]的格式定位到具体实例下的具体组
内容的提问来源于stack exchange,提问作者Karikaaalan
相关产品推荐
相关产品推荐

