Terraform 地形:模块+;每个_的输出
我有一个使用模块的地形脚本。我想创建多个资源,所以我使用for_each方法 以下是我的变量配置:Terraform 地形:模块+;每个_的输出,terraform,terraform0.12+,Terraform,Terraform0.12+,我有一个使用模块的地形脚本。我想创建多个资源,所以我使用for_each方法 以下是我的变量配置: variable bridge_domains { description = "Bridge Domain" type = map default = { bd1 = { name = "BD1", }, bd2 = { name = "BD2" }
variable bridge_domains {
description = "Bridge Domain"
type = map
default = {
bd1 = {
name = "BD1",
},
bd2 = {
name = "BD2"
}
}
}
在rootmain.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
(不使用[*]
或任何其他操作符),以将资源对象的整个映射公开给外部模块。