【问题标题】:How do I output an attribute of multiple instances of a resource created with for_each?如何输出使用 for_each 创建的资源的多个实例的属性?
【发布时间】:2020-09-06 20:21:31
【问题描述】:

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

【问题讨论】:

  • 如果您实际上不使用键,为什么这是一个地图,而不仅仅是一个列表/集合?
  • 鉴于提供的配置,environments 可以是 List 而不是 Map 类型,并且位置输出可以是 value = var.location。除此之外,azurerm_resource_group.resource_group 对象将不支持您自己发现的 splat 运算符。那是版本
  • 我必须使用地图,因为这是 for_each 需要的。我基本上只是想像您使用 count 和 splat 一样获取每个元素的输出。

标签: terraform terraform-provider-azure terraform0.12+


【解决方案1】:

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

但是,for expressions 是一种更通用的机制,它可以通过评估源集合中每个元素的任意表达式来将列表或映射转换为另一个列表或映射。

因此,我们可以将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"
}

【讨论】:

    【解决方案2】:

    编辑: 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"
    }
    

    【讨论】:

    • in output "name": 2: for_each = var.environments An argument named "for_each" is not expected here.
    猜你喜欢
    • 2019-10-17
    • 2019-12-16
    • 2020-06-28
    • 2021-04-15
    • 2020-01-13
    • 2020-02-12
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多