如何用Terraform循环处理映射列表并创建MongoDB Atlas项目资源
解决方案
1. 优化YAML结构
原YAML结构采用列表嵌套单键对象的形式,不利于Terraform迭代处理。调整为层级清晰的结构,每个项目包含明确的name和teams字段:
--- projects: - name: Terraform-Project-1 teams: - name: example-team-1 roles: - GROUP_READ_ONLY - GROUP_DATA_ACCESS_READ_WRITE - name: example-team-2 roles: - GROUP_READ_ONLY - GROUP_DATA_ACCESS_READ_WRITE - name: Terraform-Project-2 teams: - name: example-team-3 roles: - GROUP_READ_ONLY - GROUP_DATA_ACCESS_READ_WRITE - name: example-team-4 roles: - GROUP_READ_ONLY - GROUP_DATA_ACCESS_READ_WRITE
2. 解码YAML并提取数据
使用yaml_json_multidecoder模块解码后,通过本地变量提取项目列表和唯一团队名称:
module "yaml_json_multidecoder" { source = "levmel/yaml_json/multidecoder" version = "0.2.1" filepaths = ["./projects.yaml"] } locals { projects = module.yaml_json_multidecoder.files.projects.projects # 提取所有唯一团队名称,避免重复查询 unique_team_names = distinct(flatten([for p in local.projects : [for t in p.teams : t.name]])) }
3. 动态获取团队ID
利用mongodbatlas_team数据源,根据团队名称批量查询ID:
data "mongodbatlas_team" "teams" { for_each = toset(local.unique_team_names) org_id = "<ORG_ID>" # 替换为你的组织ID name = each.key }
4. 动态创建MongoDB Atlas项目及团队关联
使用for_each批量创建项目资源,结合dynamic块自动生成teams关联:
resource "mongodbatlas_project" "test" { for_each = { for p in local.projects : p.name => p } name = each.value.name org_id = "<ORG_ID>" # 替换为你的组织ID project_owner_id = "<OWNER_ACCOUNT_ID>" # 替换为项目所有者ID dynamic "teams" { for_each = each.value.teams content { team_id = data.mongodbatlas_team.teams[teams.value.name].id role_names = teams.value.roles } } }
关键说明
- 优化后的YAML结构确保每个项目数据格式一致,便于Terraform遍历处理。
distinct函数避免重复查询同一团队的ID,提升执行效率。for_each实现多项目批量创建,dynamic块自动完成每个项目下的多团队权限配置。
内容的提问来源于stack exchange,提问作者EDUEVER03
相关产品推荐
相关产品推荐

