如何输出用 for_each 创建的资源的多个实例的属性?

问题描述 投票:1回答:2

假设我有一个环境地图要提供给 for_each

environments = {
    "0" = "dev"
    "1" = "test"
    "2" = "stage"
}

然后不管什么原因,我想为每个环境创建一个Azure资源组。

resource "azurerm_resource_group" "resource_group" {
  for_each = var.environments
  name     = "${var.resource-group-name}-${each.value}-rg"
  location = var.location
}

我如何获得输出?我试过新的splat,但无济于事。

output "name" {
  value = "${azurerm_resource_group.resource_group[*].name}"
}

output "id" {
  value = "${azurerm_resource_group.resource_group[*].id}"
}

output "location" {
  value = "${azurerm_resource_group.resource_group[*].location}"
}

错误。不支持的属性

in output "id":
   6:   value = "${azurerm_resource_group.resource_group[*].id}"

This object does not have an attribute named "id".

如何输出一个用for_each创建的资源的多个实例的属性?

terraform terraform-provider-azure terraform0.12+
2个回答
3
投票

[*] 是从对象列表中提取属性的简写。for_each 使资源显示为一个 地图 的对象,所以 [*] 操作员是不合适的。

然而, for 表情 是一种更通用的机制,它可以通过对源集合的每个元素评估一个任意的表达式,将一个列表或地图变成另一个列表或地图。

因此,我们可以将一个映射简化为 azurerm_resource_group 对象的图谱。姓名 的那些对象,就像这样。

output "name" {
  value = { for k, group in azurerm_resource_group.resource_group: k => group.name }
}

你的输入图使用数字索引作为键,这是不寻常的,但也是允许的。正因为如此,输出的结果值会是这样的。

{
  "0" = "something-dev-rg"
  "1" = "something-test-rg"
  "2" = "something-stage-rg"
}

更常见的情况是,一个地图在 for_each 来包含一个有意义的名称作为键,这样产生的实例就可以通过这个有意义的名称来识别,而不是通过递增整数来识别。如果你改变了配置,使用环境名作为键,那么名字的映射就会像这样。

{
  "dev"   = "something-dev-rg"
  "test"  = "something-test-rg"
  "stage" = "something-stage-rg"
}

0
投票

EDIT: for_each不能用于输出

output "name"{
  value = { for k, v in var.environments : v => azurerm_resource_group.resource_group[k].name }
}

output "id"{
  value = { for k, v in var.environments : v => azurerm_resource_group.resource_group[k].id }
}

output "location"{
  value = { for k, v in var.environments : v => azurerm_resource_group.resource_group[k].location }
}

产出示例:

id = {
  "dev" = "xxx"
  "stage" = "yyy"
  "test" = "zzz"
}
© www.soinside.com 2019 - 2024. All rights reserved.