已锁定4天。此问题的评论已被禁用,但仍接受新答案和其他交互。Learn more。
目标:使用一个模块将环境中的多个子网链接到相应的NSG(NSG和子网是使用单独的模块创建的)
根模块:
1.main.tf
resource "azurerm_subnet_network_security_group_association" "root_subnet_nsg_association" {
subnet_id = var.subnet_id
network_security_group_id = var.nsg_id
}
2.variables.tf
variable "subnet_id"{
type=number
description="ID of the subnet which is to be attached to NSG"
#default=""
}
variable "nsg_id"{
type=number
description="ID of the NSG which is to be associated with a subnet"
#default=""
}
调用项目文件夹中的模块:
(for_each用于迭代模块)
1.nsg子网关联. tf
module "nsg_subnet_asosciation_module"{
source="../../Modules/network/nsg_subnet_association"
#Variable names to be passed into the root module:
#Use for_each to loop the module:
#for_each accepts a set or map but not list as a value
for_each = local.nsg_subnet_association
subnet_id=each.key
nsg_id=each.value
}
2.局部变量阻止向调用模块传递值:
- 注意:使用括号()* 可以在Map中具有动态键
locals{ //Key in subnet name and NSG name for each element of the LIST
//Implicit dependence on Subnet and NSG being created before attempt to associate
#It is possible to have dynamic keys using parenthesis () as seen on left below
nsg_subnet_association={
(module.subnet_module["MGT-Subnet-1"].subnet_id)= module.nsg_module["HUB-NSG"].nsg_id
(module.subnet_module["MGT-Subnet-1"].subnet_id) = module.nsg_module["MGT-NSG"].nsg_id
(module.subnet_module["SEC-Subnet-1"].subnet_id) = module.nsg_module["SEC-NSG"].nsg_id
}
}
这将导致以下错误:
- “for_each”Map包含从资源属性派生的键,这些属性在应用之前无法确定,因此Terraform无法确定标识此资源示例的完整键集。
在for_each中处理未知值时,最好在配置中静态定义map键,并将应用时结果仅放在map值中。
或者,您可以使用-target计划选项,首先仅应用for_each值所依赖的资源,然后再次应用以完全收敛。*
1条答案
按热度按时间c0vxltue1#
在Terraform中,当动态获取vnet或subnet的值时,可能需要花费时间来创建,并且其他依赖资源无法获取所需的值,因此发生此错误。
使用静态定义值的代码来解决错误:
示例:
代码:
或者
如果动态值必须用于_each,则在应用时不能确定密钥。在这种情况下,请使用-target选项首先应用vnet和子网值,即:for_each值所依赖并完全应用的资源。