如何通过Terraform用最少代码在20个Azure订阅部署资源组?
多订阅部署Azure资源组的极简Terraform实现
不用写20个provider块,用Terraform的动态provider配置就能搞定,核心思路是基于订阅ID动态生成provider,让资源组自动关联对应订阅的provider,具体步骤如下:
1. 调整变量结构(确保每个资源组绑定对应订阅)
首先修改你的变量,让每个资源组条目包含对应的订阅ID,示例变量定义:
variable "network_services_rgs" { type = map(object({ subs = string # 对应你原变量里的subs字段 location = string tags = optional(map(string)) })) description = "每个条目对应一个要创建的资源组,包含所属订阅ID、区域、可选标签" }
变量的实际值示例:
network_services_rgs = { "rg-dev-eastus" = { subs = "xxxx-xxxx-xxxx-xxxx" # 订阅ID1 location = "eastus" tags = { Environment = "Dev" } }, "rg-prod-westus" = { subs = "yyyy-yyyy-yyyy-yyyy" # 订阅ID2 location = "westus" } # 剩下18个资源组条目以此类推 }
2. 动态生成Azure Provider(自动对应所有订阅)
通过本地值提取唯一订阅ID,再用for_each动态创建provider,避免重复配置同一订阅:
# 提取所有不重复的订阅ID locals { unique_subs = distinct([for rg in var.network_services_rgs : rg.subs]) } # 动态创建每个订阅对应的provider provider "azurerm" { for_each = toset(local.unique_subs) alias = each.value # 用订阅ID作为provider别名,确保唯一 subscription_id = each.value # 如果所有订阅属于同一租户,可统一配置tenant_id: # tenant_id = var.tenant_id }
3. 关联资源组到对应订阅的Provider
修改资源组资源,让每个资源组自动绑定到所属订阅的provider:
resource "azurerm_resource_group" "rg" { for_each = var.network_services_rgs provider = azurerm[each.value.subs] # 关联到对应订阅的provider name = each.key location = each.value.location tags = lookup(each.value, "tags", {}) }
关键说明
- 权限:确保执行Terraform的身份(Azure CLI登录账号/服务主体)拥有所有目标订阅的资源组创建权限
- 去重逻辑:
distinct函数会自动过滤重复的订阅ID,同一订阅下的多个资源组会共用同一个provider,无需重复配置 - 兼容性:该方案需要Terraform 0.13及以上版本,因为0.13才支持provider的
for_each配置
内容的提问来源于stack exchange,提问作者Rajnish Kumar Soni
相关产品推荐
相关产品推荐

