【问题标题】:Terraform: modules + output from for_eachTerraform:模块 + for_each 的输出
【发布时间】:2021-03-07 09:18:36
【问题描述】:

我有一个使用模块的 Terraform 脚本。我想创建多个资源,所以我使用了 for_each 方法。

下面是我的变量配置:

variable bridge_domains {
  description = "Bridge Domain"
  type     = map
  default  = {
    bd1 = {
      name  = "BD1",
    },
    bd2 = {
      name    = "BD2"
    }
  }
}

在根 main.tf 文件中,我使用 for_each 循环遍历该变量:

module "schema_template_bd" {
  source = "./modules/schema_template_bd"
  for_each     =    var.bridge_domains
  
  schema       =    module.tenant.mso_schema.id 
  template     =    var.template

  bd           =    each.value.name
}

然后在modules/schema_template_bd 文件中我有以下内容:

resource "mso_schema_template_bd" "bd" {
  schema_id              =      var.schema
  template_name          =      var.template
  name                   =      var.bd
}

该模块有一个输出,我在其中定义了以下内容:

output "mso_bd" {
  value = mso_schema_template_bd.bd[*]
}

这个想法是从所有创建的对象中输出名称。所以我定义了一个output.tf 文件(在根级别),其中包含以下代码:

output "bd_name" {
  value = module.schema_template_bd.mso_bd.*.name
}

我总是得到:

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

通常bd 对象有一个名称,因此在我看来该错误与错误的语法有关。

【问题讨论】:

  • 你搞定了吗?

标签: terraform terraform0.12+


【解决方案1】:

[*].* 运算符仅用于列表。因为这个资源使用for_each而不是count,所以它在其他表达式中的值是一个map,而不是一个列表。

为了使您的配置正常工作,您需要决定是返回一个名称映射,其中键是 var.bridge_domains 键,还是只返回一组 id,调用者无法确定哪个name属于var.bridge_domains的哪个元素:

output "bd_name" {
  value = {
    for k, bd in mso_schema_template_bd.bd : k => bd.name
  }
}

output "bd_name" {
  value = [
    for bd in mso_schema_template_bd.bd : bd.name
  ]
}

如果在第二个示例中只需要唯一的结果,则可以使用函数toset

output "bd_name" {
  value = toset([
    for bd in mso_schema_template_bd.bd : bd.name
  ])
}

这使用for expressions,它是splat expressions 的更通用对应物,可用于任何类型的集合,并且可以生成序列和映射作为其结果,而 splat 表达式仅适用于列表。

【讨论】:

  • 这两个建议都会放在子模块的输出文件中,对吧?
  • 我想我在回读以修改示例时无意中将您的两个示例组合在一起。您可能需要在两层都执行类似的操作,或者您可以让内部模块直接返回mso_schema_template_bd.bd(没有[*] 或任何其他运算符)以将资源对象的整个映射公开给外部模块。
  • 第一个示例中的tomap 函数调用是多余的。地图理解已经输出了地图。第二个示例中的toset 函数调用也不是绝对必要的,只有在需要从列表中排除重复项时才需要。
猜你喜欢
  • 2021-03-31
  • 2021-09-24
  • 2021-08-16
  • 2021-03-21
  • 2021-07-09
  • 2021-08-26
  • 2021-04-14
  • 2021-05-09
  • 2021-02-12
相关资源
最近更新 更多