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
选项。
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
选项。