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

Terraform 如何输出使用for_创建的资源的多个实例的属性?,terraform,terraform-provider-azure,terraform0.12+,Terraform,Terraform Provider Azure,Terraform0.12+,比如说,我有一张环境地图要为每个人提供 environments = { "0" = "dev" "1" = "test" "2" = "stage" } 然后,无论出于什么原因,我都希望为每个环境创建一个Azure资源组 resource "azurerm_resource_group" "resource_group" { for_each = var.environments name = "${var.resource-group-name}-$

比如说,我有一张环境地图要为每个人提供

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\u创建的资源的多个实例的属性?

编辑:for\u每个实例都不能用于输出

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

[*]
是从对象列表中提取属性的缩写
for_each
使资源显示为对象的映射,因此
[*]
运算符不合适

但是,有一种更通用的机制,可以通过为源集合的每个元素计算任意表达式,将列表或映射转换为另一个列表或映射

因此,我们可以将
azurerm\u resource\u 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"
}
您的输入映射使用数字索引作为键,这是不常见但允许的。因此,输出的结果值如下所示:

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

在输出“name”:2:for_each=var.environments中,此处不需要名为“for_each”的参数如果您没有实际使用这些键,为什么这是一个映射而不仅仅是一个列表/集合?给定提供的配置,
环境
可以是一个列表而不是映射类型,并且位置输出可以是
value=var.location
。除此之外,
azurerm\u resource\u group.resource\u group
对象将不支持splat操作符,因为您已经发现了自己。这是<0.12版本的输出解决方案,但不幸的是,它没有转换为新的迭代器。我不确定你正在尝试做的事情目前是否可行。我必须使用地图,因为这是每个人所需要的。我基本上只是尝试获取每个元素的输出,就像您使用count和splat一样。