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 (存储)中使用的变量。
假设您有变量 region
和 size
传递给主模块并想在存储模块中使用,您可以按如下方式执行此操作:
module "storage" {
source = "./modules/storage"
region = var.region
size = var.size
}
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 (存储)中使用的变量。
假设您有变量 region
和 size
传递给主模块并想在存储模块中使用,您可以按如下方式执行此操作:
module "storage" {
source = "./modules/storage"
region = var.region
size = var.size
}