示例:在Azure中,我正在同一区域中部署多个资源组,托管磁盘,网络接口等。
我想声明一个“区域”原语(一个“常量”),所有这些资源都将引用该原语。 哪个遵循惯例?
a)variables.tf:
variable "region" {
type = string
default = "a-place"
}
b)locals.tf
locals {
region = "a-place"
}
自然,我会选择将其声明为本地对象。仅当我期望某个值来自环境变量,命令行或正在创建模块时,才使用变量。
但是,在任何示例中,我都没有看到local用于“声明常量”,这使我认为存在一种约定来使用范围非常有限的locals(例如,主要用于创建可以与{{1}一起使用的结构) }和count
构造)。
在有人将其标记为基于观点之前掩盖我的意思:我问的是公约,而不是您对公约应有的看法。
后续问题: 如果此示例涵盖IP地址,资源名称前缀等而不是区域,答案是否会有所不同? (公约仅涵盖特定领域吗?)
答案 0 :(得分:2)
局部值的一般意图是表示要在模块中的许多位置重复使用其结果而无需重复的表达式。其中包括常量值,在将它们排除在外的情况下很有用。因为您希望它们将来会更改,并且只希望在一个地方进行更改,或者因为本地值名称比值本身更有意义,从而提高了使用它的配置部分的可读性。
但是,声明局部值也有潜在的成本:它迫使阅读模块其余部分的任何人都在其他地方查看以查看每次引用其最终值。收益往往超过成本,但并非总是如此。
正如您所指出的,输入变量的意图是它们可由模块的调用者设置,因此仅当您期望有时会覆盖默认值时,才应使用输入变量。