使用for_each表达式时,在Terraform中出现不受支持的属性错误

时间:2019-08-09 13:38:09

标签: terraform

在Terraform v0.12.6中使用 for_each 表达式动态生成vnet子网的内联块(Azure)。我定义了列表变量“子网”,其中两个子网分别为“ sub1”和“ sub2”

variable "subnets" {
  default = [
    {
      name   = "sub1"
      prefix = "1.1.1.1/32"
    },
    {
      name   = "sub2"
      prefix = "2.2.2.2/32"
    },
  ]
}

然后遍历“ azurerm_virtual_network”块中的列表变量以创建动态子网块

dynamic "subnet" {
    for_each = [for s in var.subnets  : { 
        name   = s.name
        prefix = s.prefix
    }]

    content {
      name           = subnet.name
      address_prefix = subnet.prefix
    }   
  }
}

第一个是错误:属性不受支持

在main.tf第42行的资源“ azurerm_virtual_network”“ vnet”中:   42:名称= subnet.name

该对象没有名为“ name”的属性。

1 个答案:

答案 0 :(得分:1)

dynamic块创建的迭代器对象具有两个属性:

  • key:当前元素的地图关键字或列表索引
  • value:当前元素的值

在这种情况下,用于重复的集合是对象列表,因此subnet.key将是整数索引0、1,...,而subnet.value将是与该索引关联的对象

要获得所需的结果,您需要访问subnet.value上的对象属性:

dynamic "subnet" {
    for_each = [for s in var.subnets  : { 
        name   = s.name
        prefix = s.prefix
    }]

    content {
      name           = subnet.value.name
      address_prefix = subnet.value.prefix
    }   
  }
}

似乎var.subnets已经与content块期望的对象结构兼容,因此可以通过直接访问它来进一步简化它:

dynamic "subnet" {
    for_each = var.subnets

    content {
      name           = subnet.value.name
      address_prefix = subnet.value.prefix
    }   
  }
}

只要var.subnets已经是对象列表,则应该产生相同的结果。