Terraform 模块无法访问变量

Terraform module unable to access variables

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

创建了我的第一个模块,一个名为 'storage' 的根目录子模块,我想在其中放置存储帐户的所有模板。我以为这会很简单。

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

但现在当我尝试类似的东西时:

terraform 计划-var-file='env/dev/dev.tfvars'

None 个我的 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 文件中)。

然后我尝试使用 'default' 将值添加到变量定义中,这确实有效 - 但这意味着我不能再使用 .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)

我想要做的就是获取根 variables.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 中复制这些变量?如果是这样,我如何在不使用 'default' 的情况下为它们获取值,因为那样会破坏可伸缩性。

我确定我遗漏了一些基本的东西。

谢谢!

假设您要从根模块传递模块中的变量 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
}

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

假设您有变量 regionsize 传递给主模块并想在存储模块中使用,您可以按如下方式执行此操作:

module "storage" {
  source = "./modules/storage"
  region = var.region
  size   = var.size
}