Terraform:可以动态解析模块的名称吗?

时间:2019-11-04 20:29:43

标签: terraform

给出一系列名称遵循模式的模块:

module "mod-a" {
  // ...
}

module "mod-b" {
  // ...
}

module "mod-b" {
  // ...
}

并假设每个模块都定义了一个名为my_output的输出,我可以基于动态解析的名称引用特定的模块吗?

例如

...
// some_module = "mod-a"
some_value = module[some_module].my_output
...

上面的语法给出错误:

The "module" object cannot be accessed directly. Instead, access one of its
attributes.

还有另一种方法来访问仅在运行时知道其名称的模块吗?

1 个答案:

答案 0 :(得分:0)

要在当今的Terraform(Terraform 0.12.13)中实现此目标,您需要明确地构造一个合适的地图作为局部值,然后对该地图进行索引:

locals {
  modules = {
    mod_a = module.mod_a
    mod_b = module.mod_b
    mod_c = module.mod_c
  }
}

然后在配置的其他地方,可以使用local.modules[local.dynamic_module_key]之类的表达式,从地图中选择所需的对象。

Terraform需要对此类对象的静态引用,以便它可以正确构造依赖关系图。在这种情况下,Terraform推断local.modules取决于这三个模块的所有输出,因此引用local.modules的所有内容都必须等待,直到所有这些模块的所有输出准备就绪以确保最终索引操作具有完整的价值。