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

2024-04-28

假设我有一个环境地图要提供给 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 创建的资源的多个实例的属性?


The [*]是从对象列表中提取属性的简写。for_each使资源显示为map相反,所以[*]运营商不合适。

然而,for表达式 https://www.terraform.io/docs/configuration/expressions.html#for-expressions是一种更通用的机制,可以通过评估源集合中每个元素的任意表达式将列表或映射转换为另一个列表或映射。

因此我们可以简化一张地图azurerm_resource_group对象映射到names这些对象是这样的:

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"
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何输出使用 for_each 创建的资源的多个实例的属性? 的相关文章

随机推荐