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

如何用Terraform创建嵌套Azure管理组层级结构?

实现Terraform嵌套Azure管理组层级结构

1. 调整输入变量结构

首先修改模块的variables.tf,定义支持嵌套层级的变量结构,用嵌套对象列表描述管理组的层级关系:

variable "management_groups" {
  type = list(object({
    name         = string
    display_name = string
    children     = optional(list(object({
      name         = string
      display_name = string
      children     = optional(list(object({
        name         = string
        display_name = string
        # 按需扩展更多层级
      })))
    })))
  }))
  description = "带层级关系的管理组定义,支持多层嵌套"
}

2. 分层循环创建管理组

在模块的main.tf中,通过多层for_each循环分别创建顶层、一级子、二级子(及更深层级)的管理组,自动传递父级ID:

# 创建顶层管理组
resource "azurerm_management_group" "top_level" {
  for_each = {
    for mg in var.management_groups : mg.name => mg
  }

  name         = each.value.name
  display_name = each.value.display_name
}

# 创建一级子管理组
resource "azurerm_management_group" "level_1" {
  for_each = {
    for top_mg in var.management_groups :
    for child_mg in top_mg.children :
    "${top_mg.name}-${child_mg.name}" => merge(child_mg, { parent_name = top_mg.name })
  }

  name         = each.value.name
  display_name = each.value.display_name
  parent_id    = azurerm_management_group.top_level[each.value.parent_name].id
}

# 创建二级子管理组(按需扩展更多层级)
resource "azurerm_management_group" "level_2" {
  for_each = {
    for top_mg in var.management_groups :
    for level1_mg in top_mg.children :
    for child_mg in level1_mg.children :
    "${top_mg.name}-${level1_mg.name}-${child_mg.name}" => merge(child_mg, { parent_key = "${top_mg.name}-${level1_mg.name}" })
  }

  name         = each.value.name
  display_name = each.value.display_name
  parent_id    = azurerm_management_group.level_1[each.value.parent_key].id
}

3. 模块调用示例

在根模块中按嵌套结构传入管理组定义,即可自动生成层级:

module "mg_hierarchy" {
  source = "./modules/mg"

  management_groups = [
    {
      name         = "App"
      display_name = "应用管理组"
      children = [
        {
          name         = "Prod"
          display_name = "生产环境"
        },
        {
          name         = "Test"
          display_name = "测试环境"
        },
        {
          name         = "Dev"
          display_name = "开发环境"
        }
      ]
    },
    {
      name         = "Platform"
      display_name = "平台管理组"
      children = [
        {
          name         = "Infra"
          display_name = "基础设施服务"
        }
      ]
    }
  ]
}

关键说明

  • 每个层级的资源通过parent_id自动关联父管理组的ID,无需手动配置。
  • 资源的for_each键用父级名称+自身名称拼接,确保全局唯一,避免命名冲突。
  • 如需支持更深层级,只需按照相同模式添加对应层级的资源块和循环逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:55:21