Terraform:模块+for_each输出

81

我有一个使用模块的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 对象通常都有一个名称,因此这个错误可能与我的代码语法有关。


2
你搞定了吗? - Vaishnav
2个回答

137

[*].* 操作符仅适用于列表。由于此资源使用 for_each 而不是 count,因此其在其他表达式中的值为 映射,而不是列表。

要使您的配置工作,您需要决定是返回名称的映射,其中键是 var.bridge_domains 的键,还是仅返回 ID 集,然后调用者无法确定哪个名称属于 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 表达式,它们是更通用的 splat 表达式 的对应物,可以使用任何类型的集合并可产生序列和映射作为其结果,而 splat 表达式仅使用列表。


1
这两个建议都会放在子模块的输出文件中,对吧? - wiwa1978
1
我想当我回读示例以进行修改时,不经意地将您两个示例结合在一起。您可能需要在两个层面上都执行类似的操作,或者您可以让内部模块直接返回 mso_schema_template_bd.bd(没有 [*] 或任何其他运算符),以将整个资源对象映射公开给外部模块。 - Martin Atkins
1
第一个示例中的“tomap”函数调用是多余的。映射推导已经输出了一个映射。第二个示例中的“toset”函数调用也不是严格必要的,只有在需要从列表中排除重复项时才需要。 - Victor Schröder

54

如果有人感兴趣,我会把这个留在这里。

output "bd_name" {
  value = values(mso_schema_template_bd.bd).*.name
}

12
使用另一种语法,同样的含义是:mso_schema_template_bd.bd.values().name - George L. Yermulnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接