Terraform 共享模块的公共变量

Terraform share common variables for modules

我们在 AWS 上的基础设施中有一个通用变量,计划供多个模块使用。例如子网id,vpc id等等。

为了避免重复 *.tfvars 文件中每个模块中的那些变量。是否可以让它们从任何 Terraform 模块可用?而模块本身可以相互隔离。

我在考虑某种核心模块,它可以在需要公共变量的地方导入。但怀疑模块是否是正确的方法,因为模块打算只包含 resources,但我们只需要公开变量。使用模块共享变量是正确的方法吗?或者你们是怎么解决这个问题的?认为这在 terraform 中很常见还是不好的方法?)

谢谢。

如果您有一组要重用的表达式(包括 hard-coded 文字值),那么编写一个仅包含输入变量声明、局部值和输出值的模块是有效的建模的方法。

最简单的形式是只包含 output 块的模块,其值为 hard-coded 文字值,如下所示:

output "example" {
  value = "result"
}

官方模块hashicorp/subnets/cidr就是一个例子:它没有声明自己的任何资源,而是封装了一些逻辑,用于根据一些输入变量计算一组子网。

这是 Data-only Modules 的一个特例,其中数据来自模块本身内部,而不是来自数据源。以这种方式对共享数据建模的一个好处是,如果您以后决定根据数据源自动计算这些结果,那么您将能够这样做,同时保持细节封装。例如,如果您定义一个模块,它将环境名称作为输入变量和 returns 派生的关于该环境的设置,该模块可能包含本地逻辑来计算今天的结果,但稍后可以通过获取来确定其中的一些设置如果需要,可以从指定的远程位置获取它们,例如 AWS SSM Parameter store。