Terraform非根模块能否为传递的Provider补充动态资源参数?
问题场景与代码结构
根模块
terraform { required_providers { ibm = { source = "IBM-Cloud/ibm" version = ">= 1.50.0" } } } module "ibm-cloud-infr" { providers = { ibm = ibm.ibmcloud } source = "./modules/ibm-cloud" } provider "ibm" { alias = "ibmcloud" region = var.region zone = var.zone ibmcloud_api_key = var.ibmcloud_api_key iaas_classic_username = var.iaas_classic_username iaas_classic_api_key = var.iaas_classic_api_key }
模块 ibm-cloud-infr
terraform { required_providers { ibm = { source = "IBM-Cloud/ibm" version = ">= 1.50.0" } } } resource "ibm_resource_group" "VMware" { name = "VMware" } module "vsphere-site" { providers = { # 问题点在此处 } source = "./modules/vsphere-site" }
子模块 vsphere-site
terraform { required_providers { ibm = { source = "IBM-Cloud/ibm" version = ">= 1.50.0" } } } # 部分使用该Provider的资源
核心问题
子模块vsphere-site所需的IBM Provider需要传入来自ibm-cloud-infr模块中ibm_resource_group.VMware.id作为resource_group参数,示例配置如下:
provider "ibm" { # ... resource_group = ibm_resource_group.VMware.id }
根据Terraform文档,Provider仅能在根模块(第0层)定义,但此处需要传递给二级子模块的Provider参数仅在一级模块中生成。请问是否可以在≥1级的模块中,对从根模块传递来的Provider进行参数覆盖或补充?
解决方案
Terraform允许通过在模块内创建带别名的Provider实例,继承并补充父模块传递的Provider配置,以此解决该问题,具体步骤如下:
- 在
ibm-cloud-infr模块中,基于根模块传入的ibmProvider,创建带资源组参数的别名Provider:
# 在ibm-cloud-infr模块中新增 provider "ibm" { alias = "vmware_rg" # 继承根模块Provider的所有基础配置 region = ibm.ibmcloud.region zone = ibm.ibmcloud.zone ibmcloud_api_key = ibm.ibmcloud.ibmcloud_api_key iaas_classic_username = ibm.ibmcloud.iaas_classic_username iaas_classic_api_key = ibm.ibmcloud.iaas_classic_api_key # 补充当前模块生成的资源组ID参数 resource_group = ibm_resource_group.VMware.id }
- 在
ibm-cloud-infr模块调用vsphere-site时,将这个带补充参数的别名Provider传递给子模块:
module "vsphere-site" { providers = { ibm = ibm.vmware_rg } source = "./modules/vsphere-site" }
- 子模块
vsphere-site的现有required_providers声明已符合要求,模块内的资源会自动使用传递过来的带resource_group参数的Provider实例。
关键说明
- 模块内定义Provider必须使用
alias,避免与父模块传递的默认Provider实例冲突。 - 通过
ibm.<别名>.<参数名>的方式可直接继承父模块Provider的配置,无需重复定义变量。 - 这种方式是创建新的Provider实例而非修改根模块配置,完全符合Terraform的模块隔离设计原则。
内容的提问来源于stack exchange,提问作者Iresh Dissanayaka
相关产品推荐
相关产品推荐

