【问题标题】:How to append in terraform output variables to list in root module?如何在 terraform 输出变量中附加到根模块中的列表?
【发布时间】:2020-04-09 03:21:36
【问题描述】:

我们尝试使用 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.

谢谢

【问题讨论】:

    标签: terraform


    【解决方案1】:

    Terraform 变量不是可变的,这意味着一旦定义了它们,它们的变量就固定了。我们可以做的是创建一个 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 通过分析引用自动推断操作顺序:它可以自动确定必须在 module.product_a.usersmodule.product_b.users 之后评估 local.all_users,因为这两个对象都在其表达式中提及。此外,您在这两个模块的output "users" 块中的value 参数中引用的任何对象都将被理解为输出的依赖项。通过遵循这些连接中的每一个,Terraform 可以自动对您声明的所有对象的总体所需操作顺序进行全局理解。

    【讨论】:

    • 这仅在 module.product_a.users 和 module.product_b.users 是列表时有效。 concat() 接受两个或多个列表并将它们组合成一个列表 - 如果输出是字符串,它将不起作用
    猜你喜欢
    • 1970-01-01
    • 2019-09-21
    • 2021-05-06
    • 2021-08-20
    • 2020-07-16
    • 2021-08-13
    • 2019-10-06
    • 2021-01-11
    • 2021-04-07
    相关资源
    最近更新 更多