Terraform:来自多个模块调用的输出

Terraform:来自多个模块调用的输出,terraform,hcl,Terraform,Hcl,伪代码: module "foo-1" { source="./foo" input=1 } module "foo-2" { source="./foo" input=2 } module "foo-3" source="./foo" input=3 } ...etc... (模块./foo根据输入值输出唯一id) 问题: m

伪代码:

module "foo-1" {
    source="./foo"
    input=1
}
module "foo-2" {
    source="./foo"
    input=2
}
module "foo-3"
    source="./foo"
    input=3
}
...etc...
(模块./foo根据输入值输出唯一id)

问题:

module "foo-1" {
    source="./foo"
    input=1
}
module "foo-2" {
    source="./foo"
    input=2
}
module "foo-3"
    source="./foo"
    input=3
}
...etc...
我希望能够任意实例化/调用./foo模块,并从每个模块实例访问唯一的id。我无法用Terraform实现这一点,因为输出语法需要每个模块实例化一个唯一的val=表达式。模块对象(module.*.id)上的Splat表达式很遗憾(这并不奇怪)不受支持


我猜这不能在terraform中实现,但很可能是错误的。

因为这些模块中的每一个都与terraform的透视图完全不同,要将它们的结果聚集到一个值中,需要编写一个表达式来描述这一点。例如:

locals {
  foos = [
    module.foo_1,
    module.foo_2,
    module.foo_3,
  ]
}

有了这样的定义,您可以在模块的其他地方编写一个表达式,如
local.foos[*].id
,以收集所有模块中的所有
id

感谢您的跟进和建议,Martin。不幸的是,如上所述,每次调用一个新的模块实例时都需要更新本地数组,这是我正在尝试/希望避免的,因为在我的实际用例中,每个子模块实例都位于调用模块中它自己的.tf文件中。Terraform无法自动理解这些模块一起运行,所以你必须告诉我。一种替代方法是在单个模块块中使用
count
for_each
,根据一个集合系统地定义同一模块的多个实例,假设它们的输入变量定义足够相似,都来自同一源表达式。再次感谢,Matin。是的,我考虑过循环操作,但它们不会在架构或输出时钟的范围内工作(因为无法收集所有模块)。在我们准备好重新构建根模块(按照用户TFE的方式进行设置并最大限度地减少工作区许可证的使用)之前,我可能会一直使用它。