1

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

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.insidemzroutes.var.subnet_name:找不到变量‘azurerm_subnet.subnet.5.name’的资源‘azurerm_subnet.subnet’”

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}"]
}

这不起作用还是我的参考构造不正确?

4

1 回答 1

1

请查看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)}"
于 2018-12-13T10:04:20.810 回答