无法访问模块内的变量

问题描述 投票:0回答:2

Terraform 新手希望能朝正确的方向推动。

已经创建了我的第一个模块,一个名为“存储”的 root 子模块,我想在其中放置存储帐户的所有模板。我以为这很简单。

我添加了一个名为“storage”的文件夹,并将现有的“storage.tf”文件移入其中,并将添加的模块块添加到我的 main.tf(在根目录中)以告诉它该模块存在。我做了一个 terraform init,它找到并安装了它 - 太棒了!

但是现在当我尝试类似的事情时:

terraform plan -var-file='env/dev/dev.tfvars'

找不到我的 storage.tf 文件引用的任何变量。我刚刚得到:

Error: Reference to undeclared input variable
│
│   on modules\storage\storage.tf line 11, in resource "google_storage_bucket" "new_bucket":
│   11:   name                        = "${var.env_name}-${var.name_of_bucket}-test"
│
│ An input variable with the name "env_name" has not been declared. This variable can be declared with a variable "env_name" {} block.

我的所有变量都在 root 中的 Variables.tf 中定义,当运行 terraform 时,我使用 .tfvars 方法传入相关变量值的路径。

为什么模块看不到这些?

我尝试在模块目录中的 storage.tf 文件旁边创建一个 vars.tf。我将变量定义复制到该文件中,并收到变量值丢失的错误(即使这些值位于调用中使用的 .tfvars 文件中)。

然后,我尝试使用“默认”将值添加到变量定义中,这实际上有效 - 但这意味着我不能再使用 .tfvars 来控制我正在配置的环境。

我一定错过了一些非常基本的东西!

问题:如何让我的模块接受 .tfvars 中包含的值?我不介意将每个模块所需的变量放在每个模块的单独的 vars.tf 中 - 这很好并且实际上很有用,但是必须有某种方法可以使用简单的 .tfvars 传递值?请问...我错过了什么?

更新 下面是文件夹和文件结构,如果我没有使用正确的图表语法,抱歉!

condo (folder)
|--.git (folder)
|--.github (folder)
|--creds (folder)
|   |--dev_creds.json (file)
|   |--prod_creds.json (file)
|
|--infracomm (folder) (root)
    |
    |--.terraform (file)
    |--.terraform.hcl.lock (file)
    |--env (folder)
    |   |--dev (folder)
    |   |   |--dev.tfvar (file)
    |   |
    |   |--prod (folder)
    |       |--prod.tfvars (file)
    |
    |--modules (folder) (child module)
    |   |--storage (folder)
    |       |--storage.tf (file)
    |
    |--backend.tf (file)
    |--main.tf (file)
    |--variables.tf (file)

我想做的就是获取根变量中的变量。tf 以及我在 cli arg 中提供的这些变量的值

-var-file='./env/dev/dev.tfvars'

可在存储模块内使用。

更新#2

这是根目录中 main.tf 的代码,我在其中引用子模块。如果需要更多信息,请告诉我:

provider "google" {
  project     = var.project_name
  region      = "europe-west4"
  zone        = "europe-west4"
  credentials = var.credentials_path
}

// Define modules
module "storage" {
  source = "./modules/storage"
}

我需要在模块的 vars.tf 中复制这些变量吗?如果是这样,我如何在不使用“默认”的情况下将值放入其中,因为这会破坏可扩展性。

我确信我错过了一些基本的东西。

谢谢!

terraform
2个回答
3
投票

假设您想从根模块传递模块中的变量 variable_to_child_module

该变量的值是通过根模块中的.tfvars文件添加的,即variable_from_root_module

当您从根模块调用存储模块时传递变量

// Define modules
module "storage" {
  source = "./modules/storage"
  variable_to_child_module = var.variable_from_root_module
}

另外,在

./modules/storage
目录中,您应该添加一个
variables.tf
,您将在其中添加变量定义

例如

variable "variable_to_child_module" {
  description = "my child module variable"
  type        = string
}

3
投票

将每个模块(根和存储)视为一个独立的模块。您需要在子模块本身中(重新)定义在子模块(存储)中使用的变量。

假设您有变量

region
size
传递到主模块并希望在存储模块中使用,您可以按如下方式执行此操作:

module "storage" {
  source = "./modules/storage"
  region = var.region
  size   = var.size
}
© www.soinside.com 2019 - 2024. All rights reserved.