【问题标题】:terraform - set a variable from commandline for module variableterraform - 从命令行为模块变量设置一个变量
【发布时间】:2022-01-27 03:56:29
【问题描述】:

我有以下结构

main.tf
modules
--moduleA
----worker.tf
----variables.tf

main.tf 的内容:

module "moduleA" {
  source = "./modules/moduleA"
}

variables.tf 的内容:

variable "num_of_workers" {
  type        = number
  description = "This is number of workers"
  default     = 1

我想共同打电话terraform apply var="num_of_workers=12" 我收到一个错误:

Error: Value for undeclared variable
│ A variable named "num_of_workers" was assigned on the command line, but the root module does not declare a variable of that name. To use this value, add a "variable" block to the configuration.

有没有办法在模块的 variables.tf 中设置变量并从命令行设置它们?我在这里缺少什么?

【问题讨论】:

    标签: terraform terraform-provider-azure


    【解决方案1】:

    您还需要在父级声明变量。然后你可以像这样将父级值传递给模块:

    variable "num_of_workers" {
      type = number
    }
    
    module "moduleA" {
      source = "./modules/moduleA"
      num_of_workers = var.num_of_workers
    }
    

    然后你可以像这样在命令行设置父级值:

    terraform apply -var num_of_workers=2
    

    【讨论】:

    • 是的,我自己通过反复试验得到了这个答案。我希望有一个更优雅的解决方案 - 我想将所有内容保留在 moduleA 本身中。所以基本上现在我在模块 A 中定义了一个虚拟变量占位符:变量 "num_of_workers" {type = number} 和一个在根级别定义的带有验证的整个变量 - 更多代码和胶水 num_of_workers = var.num_of_workers。它并不优雅,但很有效。
    • 还有,不知何故,它不适用于定位。知道为什么吗? terraform apply -target=modules.moduleA="num_of_workers=4" 不使用变量值,表示没有变化。
    • 我发现 Terraform 模块是完全自包含的并且不会将其变量泄漏到父模块中,这非常优雅。您所说的“应该”工作的方式实际上会破坏在父模块中多次使用模块的能力。
    • 定位,请看语法。 terraform apply -target=modules.moduleA="num_of_workers=4" 您缺少 -var 参数,并添加了不必要的引号。应该是这样的:terraform apply -target=modules.moduleA -var num_of_workers=2
    • 嗨,马克,无论哪种方式都可以正常工作。我的错误是拼写错误“模块”,因为它应该是“模块”。使用引号,如果我删除“s”,则不使用。
    【解决方案2】:

    您可以从命令行分配一个变量,如下所示:

    terraform apply -var num_of_workers=2
    

    或者像这样:

    terraform apply -var 'num_of_workers=2'
    

    参考:Terraform docs

    【讨论】:

    • 是的,我实际上就是这么称呼它的。问题是不同的 - terraform 需要定义两次变量才能工作,并且只允许传递定义在顶级根目录中的变量,这是一个耻辱 - 请参阅上面的答案。
    • @Wojtas.Zet 说“Terraform 需要定义两次变量才能工作”是不正确的。如果您想在命令行覆盖变量,Terraform 需要在顶层定义变量。在命令行覆盖变量并不是在 Terraform 中使用变量的唯一原因,它们“工作”就可以用于其他目的,而无需“定义两次”。
    • 我想它就是这样。对于我的用例,能够将它们仅传递给模块而不在根模块中进行其他定义会更好。我正在尝试为不同的团队使用几个独立的模块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多