Amazon web services *.tfvars文件与terraform中main.tf中传递值之间的差异

Amazon web services *.tfvars文件与terraform中main.tf中传递值之间的差异,amazon-web-services,terraform,Amazon Web Services,Terraform,为什么在调用模块时在main.tf文件而不是*.tfvars文件中传递某些值。我理解variables.tf是定义变量以及任何默认值。*。tfvar文件用于传递变量的值。但它们也传递main.tf中变量的一些值,我们称之为模块。为什么会这样?请帮忙 谷歌没有得到令人满意的答案 main.tf 但它们也有*.tfvars文件。为什么有必要在这里给Terraform输入变量一个合理的类比,而不是传递值,而是在通用编程语言中使用函数参数。与函数参数一样,Terraform输入变量有两部分:声明和定义

为什么在调用模块时在main.tf文件而不是*.tfvars文件中传递某些值。我理解variables.tf是定义变量以及任何默认值。*。tfvar文件用于传递变量的值。但它们也传递main.tf中变量的一些值,我们称之为模块。为什么会这样?请帮忙

谷歌没有得到令人满意的答案

main.tf
但它们也有*.tfvars文件。为什么有必要在这里给Terraform输入变量一个合理的类比,而不是传递值,而是在通用编程语言中使用函数参数。与函数参数一样,Terraform输入变量有两部分:声明和定义

声明表示变量存在,为其设置类型,并可选地为其设置默认值(如果设置,则使变量成为可选的):

定义为其指定一个特定值。在Terraform中,对于根模块,定义变量的是
-var
命令行参数和
.tfvars
文件。对于子模块,调用该模块的是
模块
块中的键/值对


具有参数默认值概念的通用编程语言的一个示例是Python,因此Python示例对于熟悉它的人来说可能是一个有用的类比:

def example(cidr_block="10.0.0.0/16"):
    pass
与Terraform类似,我们可以选择将此函数调用为
example()
,并应用默认值。我们还可以调用
示例(“11.0.0.0/16”)
来覆盖该默认值。第三种可能性是我们调用
示例(“10.0.0.0/16”)
并将默认值覆盖为相同的值

从Python的角度来看,在这里调用
example()
和调用
example(“10.0.0.0/16”)
之间没有功能上的区别,但是作为调用者的作者,我们可以用它来表达微妙的意图:如果我们不设置它,那么我们说“我对函数选择的任何东西都很满意;确切的值是无关的”,如果我们将参数显式设置为与默认值相同的值,那么我们会说“对于这个调用者来说,无论默认值是什么,始终选择
“10.0.0.0/16”
,这一点很重要”

关于是否显式定义Terraform输入变量的决策过程是类似的:如果所选的特定值对于调用模块来说并不重要,那么我们不妨选择默认值。但是,如果明确定义有助于未来的读者更好地理解意图,我们可以选择明确定义

variable "cidr_block" {
  type    = string
  default = "10.0.0.0/16"
}
def example(cidr_block="10.0.0.0/16"):
    pass