如何在terraform输出变量中附加到根模块中列出的列表?

时间:2020-04-07 19:02:54

标签: terraform

我们尝试将基础设施实现为具有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.

谢谢

1 个答案:

答案 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.usersmodule.product_b.users之后才求值,因为这两个对象都在其引用中提到表达。此外,在这两个模块的value块的output "users"自变量中引用的任何对象都将被理解为输出的依存关系。通过跟踪这些连接中的每一个,Terraform可以自动了解您声明的所有对象的总体所需操作顺序。