Terraform-调用模块时引用实例值引发错误



我有下面的代码块,它根据名称列表和地址前缀列表创建一堆子网。

resource "azurerm_subnet" "subnet" {
count                     = "${length(var.subnet_names)}"
name                      = "${element(var.subnet_names, count.index)}"
resource_group_name       = "${var.vnet_rg_name}"
virtual_network_name      = "${data.azurerm_virtual_network.vnet.name}"
address_prefix            = "${element(var.subnet_prefixes, count.index)}"
service_endpoints         = ["Microsoft.Sql","Microsoft.Storage","Microsoft.AzureCosmosDB"]
network_security_group_id = "${data.azurerm_network_security_group.required_nsg.id}"
route_table_id            = "${element(azurerm_route_table.routetable.*.id, count.index)}"
depends_on                = ["azurerm_route_table.routetable"]
}

然后,我尝试使用模块创建一些路由,但当我尝试使用azurerm_subnet.subnet资源的特定实例中的属性为变量传递值时,它会抛出错误:

"module.sidedmzroutes.var.subnet_name:找不到变量'azurerm_subnet.subnet.5.name'的资源'azurerm_subnet.seubnet'">

module "insidedmzroutes" {
source           = "./modules/dmzroutes"
subnet_name      = "${azurerm_subnet.subnet.5.name}"
vnet_rg          = "${data.azurerm_resource_group.vnet_rg.name}"
route_table_name = "${azurerm_route_table.routetable.5.name}"
next_hop_ip      = "${cidrhost(azurerm_subnet.subnet.5.address_prefix, 4)}"
subnet_names     = ["${var.subnet_names}"]
subnet_prefixes  = ["${var.subnet_prefixes}"]
}

这不起作用吗?还是我的引用构造错误?

请查看Terraform插值语法文档,查找interpolation syntax

以下将起作用(如Adil B所示(:

subnet_name = "${azurerm_subnet.subnet.*.name[5]}"与splat语法*一样,您可以选择使用计数变量创建的所有元素,然后返回一个列表,您可以从[5]中选择正确的元素。

但是,为什么还要传递整个子网列表?这些是哪些子网?从您的代码中还不太清楚这是您之前创建的5个子网还是不同的子网。是否为每个子网创建一个insidedmzroutes?如果是这样的话,我会去掉subnet_namevar,而是在模块内部的资源中实现这样的东西:

count = "${length(var.subnet_names)}"
subnet_name = "${element(var.subnet_names, count.index)}"

最新更新