如何通过Terraform管理多Azure订阅并配置对应状态存储?
实现方案与配置修改说明
核心思路
要同时管理Azure订阅sub1和sub2,需通过多Provider实例区分不同订阅,先为sub2创建专属的tfstate存储资源(资源组、存储账户、容器),再按需在两个订阅中创建资源,可选择单配置跨订阅管理或双配置独立管理两种模式。
步骤1:修改现有providers.tf支持跨订阅
更新配置,添加sub2对应的Provider实例(用alias标识),同时保留sub1的默认Provider:
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = ">= 2.25" } } required_version = ">= 0.16.8" # 主backend仍指向sub1的存储,用于管理sub1资源及创建sub2的backend基础资源 backend "azurerm" { resource_group_name = "my.resource_group" storage_account_name = "my.storage_account_name" container_name = "my.container_name" key = "my.terraform.tfstate" } } # 默认Provider:对应订阅sub1 provider "azurerm" { features {} # 可选:明确指定sub1的订阅ID,不指定则使用当前Azure CLI默认订阅 # subscription_id = var.sub1_subscription_id } # 订阅sub2的Provider实例,用alias区分 provider "azurerm" { alias = "sub2" features {} # 必填:指定sub2的订阅ID,也可通过环境变量ARM_SUBSCRIPTION_ID_SUB2传递 subscription_id = var.sub2_subscription_id }
步骤2:创建sub2专属的tfstate存储资源
在现有配置中添加资源定义,使用azurerm.sub2 Provider创建sub2的backend资源(这些资源归属sub2):
# sub2中存放tfstate的资源组 resource "azurerm_resource_group" "sub2_tfstate_rg" { provider = azurerm.sub2 name = "sub2-tfstate-rg" location = "East US" # 按需替换为目标区域 } # sub2中存储tfstate的存储账户(名称需全局唯一) resource "azurerm_storage_account" "sub2_tfstate_sa" { provider = azurerm.sub2 name = "sub2tfstatesa001" resource_group_name = azurerm_resource_group.sub2_tfstate_rg.name location = azurerm_resource_group.sub2_tfstate_rg.location account_tier = "Standard" account_replication_type = "GRS" allow_blob_public_access = false minimum_tls_version = "TLS1_2" } # sub2中存放tfstate的存储容器 resource "azurerm_storage_container" "sub2_tfstate_container" { provider = azurerm.sub2 name = "tfstate" storage_account_name = azurerm_storage_account.sub2_tfstate_sa.name container_access_type = "private" }
执行以下命令完成资源创建:
terraform init terraform plan terraform apply
步骤3:订阅资源管理模式选择
模式1:单配置跨订阅管理
在现有配置中,创建资源时通过provider字段指定所属订阅:
- 创建sub1的资源:无需额外指定,默认使用
azurermProvider - 创建sub2的资源:添加
provider = azurerm.sub2字段
示例:在sub2中创建虚拟机
resource "azurerm_virtual_machine" "sub2_vm" { provider = azurerm.sub2 name = "sub2-demo-vm" resource_group_name = azurerm_resource_group.sub2_tfstate_rg.name location = azurerm_resource_group.sub2_tfstate_rg.location vm_size = "Standard_D2s_v3" # 省略其他VM配置(如OS磁盘、网络接口等) }
模式2:双配置独立管理(推荐)
新建独立的Terraform配置目录专门管理sub2资源,其providers.tf配置如下(tfstate存储在sub2专属的backend中):
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = ">= 2.25" } } required_version = ">= 0.16.8" # 指向sub2专属的backend存储 backend "azurerm" { resource_group_name = "sub2-tfstate-rg" storage_account_name = "sub2tfstatesa001" container_name = "tfstate" key = "sub2.terraform.tfstate" } } # 默认Provider对应sub2 provider "azurerm" { features {} subscription_id = var.sub2_subscription_id } # 可选:若需在sub2配置中操作sub1资源,添加sub1的Provider实例 provider "azurerm" { alias = "sub1" features {} subscription_id = var.sub1_subscription_id }
注意事项
- 确保执行Terraform的账号对两个订阅均拥有足够权限(如Contributor或Owner)
- 存储账户名称需全局唯一,创建时若报错需修改名称
- 推荐通过变量传递订阅ID,避免硬编码,提升配置灵活性
内容的提问来源于stack exchange,提问作者Fr0zt
相关产品推荐
相关产品推荐

