Terraform调用同一模块创建多资源时如何省略非必要变量?
问题根源
你当前的报错是因为子网模块内的delegation块是硬编码存在的,Terraform不会因为你给块内的变量传了null就自动省略整个块,只要块存在,就要求块内的必填参数必须有有效值。
解决方案
第一步:修改子网模块的变量定义
找到modules/azure/subnet/variables.tf文件,给两个delegation相关变量添加默认null值:
variable "subnet_delegation_name" { type = string description = "Delegation名称,不需要配置delegation时留空即可" default = null } variable "subnet_service_delegation_name" { type = string description = "委托服务名称,不需要配置delegation时留空即可" default = null }
第二步:修改子网模块的subnet资源,改用动态块生成delegation
修改modules/azure/subnet/main.tf里的azurerm_subnet资源,把硬编码的delegation块替换为动态块:
resource "azurerm_subnet" "subnet" { name = var.subnet_name resource_group_name = var.resource_group_name virtual_network_name = var.virtual_network_name address_prefixes = var.subnet_address_prefixes enforce_private_link_endpoint_network_policies = var.enforce_private_link_endpoint_network_policies # 只有两个delegation参数都不为空时,才生成delegation块 dynamic "delegation" { for_each = var.subnet_delegation_name != null && var.subnet_service_delegation_name != null ? [1] : [] content { name = var.subnet_delegation_name service_delegation { name = var.subnet_service_delegation_name } } } }
第三步:调整调用逻辑
现在调用模块时,不需要delegation的subnet_private_1可以直接省略这两个参数,不需要传值,Terraform会自动使用默认的null,不会生成delegation块,也不会报错。如果你的根变量里已经给private_1的对应参数设为了null,直接沿用也可以,效果一致。
内容的提问来源于stack exchange,提问作者Promise Preston
相关产品推荐
相关产品推荐

