【问题标题】:Difference between *.tfvars file and passing values in main.tf in terraform*.tfvars 文件和在 terraform 中的 main.tf 中传递值之间的区别
【发布时间】:2019-09-22 02:41:06
【问题描述】:

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

google 没有得到满意的答案。

main.tf

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

但他们也有 *.tfvars 文件。为什么要在这里给出而不是传递值

【问题讨论】:

    标签: amazon-web-services terraform


    【解决方案1】:

    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 输入变量的决策过程类似:如果特定选择的值对调用模块并不重要,那么我们不妨选择默认值。但如果明确定义有助于未来的读者更好地理解意图,我们可能会选择明确定义。

    【讨论】:

      猜你喜欢
      • 2019-04-24
      • 2021-11-22
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 2012-07-15
      • 1970-01-01
      相关资源
      最近更新 更多