Terraform 交互式输入不适用于根模块

Terraform interactive input doesn't work with the root module

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 调用 >> C2 调用 >> 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 .terraform\modules\test_deploy\variables.tf:108,1-15: attribute "ProjectName" is required.

预期行为

我原以为当我传递 -input=true 标志时,控制台会以交互方式获取用户输入,但它似乎不起作用。

输入变量的交互式提示仅用于帮助开始使用 Terraform(例如,遵循简单的教程),因此它们的支持范围有限。为日常使用设置根模块输入变量的典型方法是创建一个 .tfvars 文件并使用 -var-file 将其传递给 Terraform,或者使用 -var.[=21 直接设置一个变量=]

另请注意,只有 根模块 输入变量可以直接设置为规划选项的一部分。任何子模块变量都是由 module 块中编写的表达式专门定义的,因此如果您希望能够在 per-run 基础上设置子模块的输入变量,您还需要声明它作为根模块变量,然后将其传递给子模块。

例如,在根模块中:

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 将自动加载 .auto.tfvars 文件,无需任何显式 -var-file 选项。