Terraform 地形:模块+;每个_的输出

Terraform 地形:模块+;每个_的输出,terraform,terraform0.12+,Terraform,Terraform0.12+,我有一个使用模块的地形脚本。我想创建多个资源,所以我使用for_each方法 以下是我的变量配置: variable bridge_domains { description = "Bridge Domain" type = map default = { bd1 = { name = "BD1", }, bd2 = { name = "BD2" }

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

以下是我的变量配置:

variable bridge_domains {
  description = "Bridge Domain"
  type     = map
  default  = {
    bd1 = {
      name  = "BD1",
    },
    bd2 = {
      name    = "BD2"
    }
  }
}
在root
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\u template\u 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[*]
}
模块有一个输出,我在其中定义了以下内容:

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
对象有一个名称,因此在我看来,错误与错误的语法有关。

[*]
*
运算符仅用于列表。因为此资源对每个
使用
,而不是
计数
,所以它在其他表达式中的值是映射,而不是列表

要使配置正常工作,您需要决定是否最好返回一个名称映射,其中键是
var.bridge\u域
键,或者只返回一组ID,调用方随后无法确定哪个名称属于
var.bridge\u域
的哪个元素:

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

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

这使用了,这是处理任何类型集合的更一般的对应项,它可以生成序列和映射作为其结果,而splat表达式只处理列表。

这两个建议都将放在子模块的输出文件中,是吗?我想我在回过头来阅读时,无意中把你的两个例子结合在了一起,以便修改这些例子。您可能需要在两个层上执行类似的操作,或者您可以让内部模块直接返回
mso\u schema\u template\u bd.bd
(不使用
[*]
或任何其他操作符),以将资源对象的整个映射公开给外部模块。