* .tfvars文件与Terraform中main.tf中传递值之间的区别

时间:2019-09-22 02:41:06

标签: amazon-web-services terraform

为什么在调用模块时在main.tf文件而不是* .tfvars文件中传递某些值。我了解variables.tf是要定义变量以及任何默认值。 * .tfvar文件将传递变量的值。但是它们也会在main.tf中传递变量的值(在我们称之为该模块的位置)。为什么会这样呢?任何帮助,请。

谷歌搜索没有令人满意的答案。

main.tf

   module =vpc
   source = ./path/vpc
    cidr_block = 11.0.0.0/16

,但它们也具有* .tfvars文件。而不是在那里传递值,为什么必须在这里给出

1 个答案:

答案 0 :(得分:0)

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")之间没有功能区别,但是作为调用者的作者,我们可以使用它来表达微妙的意图:如果我们将其保留为未设置状态,则表示“我对函数选择的内容感到满意;确切的值无关紧要”,而如果将参数显式设置为与默认值相同的值,则表示“对于我们总是 在这里选择"10.0.0.0/16"的呼叫者,无论默认值是什么。”

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