Terraform中是否支持动态创建多个azurerm provider实例?
Terraform动态生成多AzureRM Provider实例解决方案
核心限制说明
Terraform当前稳定版本暂不支持在顶级provider块中使用count、for_each参数,该功能目前处于预留状态未正式落地,同时dynamic块仅可用于生成块内部的嵌套配置,无法生成完整的顶级provider块,因此你之前的尝试无法直接生效。
可行实现方案
目前通用的实现方式是通过预生成provider配置文件的方式达成需求,具体操作步骤如下:
方案1:通过Terraform模板能力自动生成
该方案不需要引入额外外部编程语言,仅用Terraform原生能力即可实现:
- 新建provider模板文件
azurerm_providers.tftpl,内容如下:
%{ for spoke in spoke_networks ~} provider "azurerm" { features {} subscription_id = "${spoke.subscription_id}" alias = "${spoke.subscription_alias}" } %{ endfor ~}
- 新建配置生成用的Terraform文件
gen_providers.tf,内容如下(你已定义过同名变量的话可以省略变量定义部分):
variable "spoke_networks" { description = "List with the properties of the Spoke VNETs" type = list(object({subscription_alias=string ,subscription_id=string , resource_group_name=string , vnet_name=string })) } resource "local_file" "spoke_providers" { content = templatefile("${path.module}/azurerm_providers.tftpl", { spoke_networks = var.spoke_networks }) filename = "${path.module}/azurerm_spoke_providers.tf" }
- 操作流程:
- 每次更新
spoke_networks变量的取值后,先执行如下命令生成provider配置文件:
terraform init terraform apply -target=local_file.spoke_providers
- 生成完成后执行
terraform init初始化新的provider实例,后续即可正常调用所有带别名的azurerm provider。
方案2:通过外部脚本生成
你也可以使用Python、Bash等任意脚本语言,读取spoke_networks的取值直接拼接生成azurerm_spoke_providers.tf文件,逻辑与上述模板方案一致,适合已存在CI/CD流水线的场景。
注意事项
- 新增provider实例后必须重新执行
terraform init,否则Terraform无法识别新的别名provider - 生成的provider配置文件建议纳入
.gitignore,避免重复提交
内容的提问来源于stack exchange,提问作者Vasco Silva
相关产品推荐
相关产品推荐

