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 中复制这些变量吗?如果是这样,我如何在不使用“默认”的情况下将值放入其中,因为这会破坏可扩展性。
我确信我错过了一些基本的东西。
谢谢!
假设您想从根模块传递模块中的变量 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
}
将每个模块(根和存储)视为一个独立的模块。您需要在子模块本身中(重新)定义在子模块(存储)中使用的变量。
假设您有变量
region
和 size
传递到主模块并希望在存储模块中使用,您可以按如下方式执行此操作:
module "storage" {
source = "./modules/storage"
region = var.region
size = var.size
}