我们尝试将基础设施实现为具有terraform的代码,因此我们将不同的产品捆绑为模块,并带有输出变量users
。现在我们要在每个模块块之后将所有这些输出变量(用户列表)附加到根模块的全局变量。那怎么可能?
variable "users" {
type = list(string)
default = []
}
module "product_a" {
source = "./product_a"
}
var.users = concat(modules.product_a.users, var.users)
module "product_b" {
source = "./product_b"
}
var.users = concat(modules.product_b.users, var.users)
这不起作用,我收到An argument or block definition is required here. To set an argument, use the
equals sign "=" to introduce the argument value.
谢谢
答案 0 :(得分:0)
Terraform变量不是 mutable ,这意味着一旦定义了变量,它们的变量就是固定的。相反,我们可以做的是创建一个 new 值,该值是从您已经定义的变量和其他数据中得出的。
我们使用Terraform的Local Values概念为这种中间值分配名称:
variable "users" {
type = list(string)
default = []
}
module "product_a" {
source = "./product_a"
}
module "product_b" {
source = "./product_b"
}
locals {
all_users = concat(
module.product_a.users,
module.product_b.users,
var.users,
)
}
使用上述方法,您可以使用local.all_users
引用该组合结果,而将var.users
保留为原始输入。
提出问题的方式也提出了另一点:了解Terraform不是顺序编程语言很重要,因此这些块的声明顺序并不重要。我在上面的示例中将locals
块放置在两个module
块之后,只是因为它是与给定示例相比最小的变化,但是这些块实际上可以以任何顺序排列。
Terraform通过分析引用来自动推断操作顺序:它可以自动确定local.all_users
仅在module.product_a.users
和module.product_b.users
之后才求值,因为这两个对象都在其引用中提到表达。此外,在这两个模块的value
块的output "users"
自变量中引用的任何对象都将被理解为输出的依存关系。通过跟踪这些连接中的每一个,Terraform可以自动了解您声明的所有对象的总体所需操作顺序。