代码之家  ›  专栏  ›  技术社区  ›  phydeauxman

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

  •  1
  • phydeauxman  · 技术社区  · 7 年前

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

    这不起作用,或者我的引用构造不正确吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Tiemen    7 年前

    请看一下这本书 Terraform interpolation syntax documentation ,寻找 interpolation syntax .

    Adil B

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

    但是,为什么还要传递整个子网列表?这些是哪些子网?从您的代码中不太清楚这是您先前创建的5个子网还是不同的子网。您正在创建一个 insidedmzroutes subnet_name var,并在模块内的资源中实现类似的内容:

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