动态输出模块参考- Terraform



我不知道是否可能,但我想根据需要从不同模块获取输出:

locals {
node_proyect = 
[
["node_1", "project_A"],
["node_2", "project_B"],
...
["node_N", "project_N"],
]
}

工作模块:

module "node_1" {
...
}
[...]   
module "node_N" {
...
}

尝试:

module "outputs_sample" {
for_each = {for i,v in local.node_proyect: i=>v}
...
node_name = module.node_[each.value[0]].node_name
proyect_name = each.value[1]
...
} 

我想要的:

node_name --> module.node_node_1.node_name --> "string with the name with which the node has been created"
project_name --> "project_A"

下for_each:

node_name --> module.node_node_2.node_name --> "string with the name with which the node has been created"
project_name --> "project_B"

但是我得到:

Error: Reference to undeclared module
│ 
│   on ....tf line ..., in module "outputs_sample":
│ 1073:   node_name                            = module.node_[each.value[0]].node_name
│ 
│ No module call named "module.node_" is declared in module.....

模块的输出存在并且工作完美,所以如果我执行:module.node_node_1.node_nameworks.

我不知道如何让Terraform像这样解释它,而不是字面上的错误说:module.node_[each.value[0]].node_name

鉴于您声明模块在相同的配置目录中声明,尽管在问题中提供的配置中不存在,我们可以首先修复local变量的类型和结构:

locals {
node_proyect = {
"1" = "proyect_A",
"2" = "proyect_B"
}
}

现在我们可以使用它来进行模块迭代,并修复值访问器和字符串插值,并删除不必要的列表构造函数,也会导致问题:

module "outputs_sample" {
source   = "./module"
for_each = local.node_proyect
...
node_name    = "module.node_${each.key}.node_name"
proyect_name = each.value
...
}

但是这仍然会导致问题,因为违反了Terraform DSL。你需要重构你的模块声明(仍然没有问题,所以这里需要假设):

module "node" {
...
for_each = local.node_proyect
...
}

,然后可以从生成的对象映射中正常访问输出:

module "outputs_sample" {
source   = "./module"
for_each = local.node_proyect
...
node_name    = module.node[each.key].node_name
proyect_name = each.value
...
}

在所有这些修复你的配置之后,你将实现你的目标。

最新更新