Terraform获取列表的长度

MMT*_*MMT 2 terraform

我正在试用Terraform,遇到了当地人。我正在尝试做的是基于另一个变量(env)获取列表的长度。

在尝试评估长度之前如何使Terrform评估变量?

这是我的代码:

locals {
  env = "${terraform.workspace}"

  subnet_names = {
    "default" = ["default_sub1"]
    "dev"     = ["dev_sub1", "dev_sub2", "dev_sub3"]
    "prod"    = ["prod_sub1", "prod_sub2", "prod_sub3"]
  }

}

resource "azurerm_subnet" "subnet" {
  name                      = "${lookup(local.subnet_names, local.env, count.index)}"
  virtual_network_name      = "${azurerm_virtual_network.network.name}"
  resource_group_name       = "${azurerm_resource_group.terraform.name}"
  address_prefix            = "10.0.1.0/24"
  network_security_group_id = "${azurerm_network_security_group.security_group.id}"
  count                     =  "${length(local.subnet_names, local.env)}"
}
Run Code Online (Sandbox Code Playgroud)

当我尝试验证代码时,我得到了length: expected 1 arguments, got 2 in${length(local.subnet_names, local.env)}

这有什么窍门?

ade*_*aru 5

local.subnet_names是不是列表,它是一个地图,并且可以作为解释的访问插语法

${length(local.subnet_names[local.env])}
Run Code Online (Sandbox Code Playgroud)

编辑:

对于name变量,正确的方法是使用元素插值:

name = "${element(local.subnet_names[local.env], count.index)}"
Run Code Online (Sandbox Code Playgroud)

这是由于local.subnet_names[local.env]将返回列表的事实。例如,如果local.env为“ dev”,它将返回

["dev_sub1", "dev_sub2", "dev_sub3"]
Run Code Online (Sandbox Code Playgroud)

为了获得列表中某个索引中的元素,我们使用element

  • 不能回答您的问题,只是想指出https://www.terraform.io/docs/commands/console.html在尝试找出所有terraform插值函数的正确组合时确实很有用 (2认同)