Terraform 输入变量的一个合理类比是通用编程语言中的函数参数。与函数参数一样,Terraform 输入变量也有两部分:声明和定义。
声明说变量存在,为它设置一个类型,并为它设置可选的默认值(如果设置,则使变量成为可选):
variable "cidr_block" {
type = string
default = "10.0.0.0/16"
}
定义赋予它一个特定的值。在 Terraform 的情况下,对于根模块,定义变量的是 -var 命令行参数和 .tfvars 文件。对于子模块,它是调用该模块的 module 块内的键/值对。
具有参数默认值概念的通用编程语言的一个示例是 Python,因此对于熟悉它的人来说,Python 示例可能是一个有用的类比:
def example(cidr_block="10.0.0.0/16"):
pass
与 Terraform 类似,我们可以选择将此函数称为 example(),并应用默认值。我们也可以调用example("11.0.0.0/16") 来覆盖该默认值。第三种可能性是我们调用example("10.0.0.0/16") 并将默认值覆盖为相同的值。
从 Python 的角度来看,在此处调用 example() 和调用 example("10.0.0.0/16") 之间没有功能区别,但作为调用者的作者,我们可以使用它来表达微妙的意图:如果我们离开它unset 然后我们说“我对函数选择的任何内容都很满意;确切的值无关紧要”,而如果我们将参数显式设置为与默认值相同的值,我们会说“对于这个调用者来说,我们很重要总是在这里选择"10.0.0.0/16",不管默认值是什么”。
是否显式定义 Terraform 输入变量的决策过程类似:如果特定选择的值对调用模块并不重要,那么我们不妨选择默认值。但如果明确定义有助于未来的读者更好地理解意图,我们可能会选择明确定义。