Terraform版本
Terraform v1.1.2
on windows_amd64
Terraform配置文件
child_module1.tf(C1(:
# Create Resource Group
resource "aws_resourcegroups_group" "resourcegroups_group" {
name = "test"
resource_query {
query = <<JSON
{
"ResourceTypeFilters": [
"AWS::EC2::Instance"
],
"TagFilters": [
{
"Key": "project",
"Values": ["${var.ProjectName}"]
}
]
}
JSON
}
}
child_module1_variables.tf:
########
variable "ProjectName" {
type = string
description = "This name would be prefixed with the cluster names."
}
现在在另一个子模块中调用此子模块**(C2(**:child_module2.tf:
module "prepare_aws_cloud" {
source = "./modules/aws/prepare_cloud_copy"
ProjectName = "${var.test.ProjectName}"
}
child_module2_variables.tf:
variable "test" {
type = object({
ProjectName = string
})
}
现在我创建了一个根模块(R1(**,它调用child_module2.tf:**
terraform {
backend "local" {
}
}
module "test_deploy" {
source = "D:\REPO\installer_v2.2.22.1\installer\aws"
test = {
#ProjectName = ""
}
}
因此,依赖关系如下:R1调用>gt;C2呼叫>gt;C1
错误
PS D:tkgTest> terraform apply -input=true
╷
│ Error: Invalid value for module argument
│
│ on testing.tf line 21, in module "test_deploy":
│ 21: test= {
│ 22: #ProjectName = ""
│ 23: }
│
│ The given value is not suitable for child module variable "test" defined at .terraformmodulestest_deployvariables.tf:108,1-15: attribute "ProjectName" is required.
预期行为
当我传递-input=true
标志时,我本以为控制台会以交互方式接收用户输入,但似乎不起作用。
输入变量的交互式提示仅用于帮助开始使用Terraform(例如,遵循一个简单的教程(,因此它们的支持范围有限。设置根模块输入变量以供例程使用的典型方法是创建一个.tfvars
文件并将其与-var-file
一起传递给Terraform,或者直接使用-var
设置变量。
还请注意,只有根模块输入变量可以直接设置为计划选项的一部分。任何子模块变量都是由module
块中编写的表达式专门定义的,因此,如果希望能够在每次运行的基础上设置子模块的输入变量,则还需要将其声明为根模块变量,然后将其传递给子模块。
例如,在根模块中:
variable "test" {
type = object({
ProjectName = string
})
}
module "test_deploy" {
source = "./installer/aws"
test = var.test
}
然后,您可以使用以下内容创建一个example.tfvars
文件来设置变量的值:
test = {
ProjectName = "example"
}
运行Terraform:时指定该文件
terraform apply -var-file=example.tfvars
如果您总是设置相同的值,那么您可以通过将文件命名为example.auto.tfvars
并将其放置在运行Terraform的同一目录中来避免需要额外的选项。Terraform将在没有任何显式-var-file
选项的情况下自动加载.auto.tfvars
文件。