无法在 Terraform 0.12 的子模块中声明地图变量



我以前在terraform中有(工作(地图变量,但升级到terraform 0.12后,我不断收到表单错误:

Error: Invalid value for module argument
on main.tf line 84, in module "gke":
84:   gke_label             = "var.gke_label"
The given value is not suitable for child module variable "gke_label" defined
at gke/variables.tf:40,1-19: map of any single type required.

我不知道如何升级这些映射变量。(对我来说(这方面的文件不是特别清楚。

我的设置如下:我有一个地形文件夹结构:

├── infrastructure
│   ├── backend
│   │   ├── subnet
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   └── vpc
│   │       ├── main.tf
│   │       └── outputs.tf
│   ├── backend.tf
│   ├── backend.tfvars
│   ├── gke
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── main.tf
│   ├── outputs.tf
│   ├── variables.tf
│   └── versions.tf

在main.tf内我曾经/曾经(以及其他人(:

module "gke" {
source                = "./gke"
region                = "var.region"
min_master_version    = "var.min_master_version"
node_version          = "var.node_version"
gke_num_nodes         = "var.gke_num_nodes"  # [MAP VARIABLE]
vpc_name              = "module.vpc.vpc_name"
subnet_name           = "module.subnet.subnet_name"
gke_master_user       = "var.gke_master_user"
gke_master_pass       = "var.gke_master_pass"
gke_node_machine_type = "var.gke_node_machine_type"
gke_label             = "var.gke_label"   # [MAP VARIABLE]
}

和变量.tf(以及其他(

variable "gke_label" {
default = {
prod = "prod"
dev  = "dev"
}
variable "gke_num_nodes" {
default = {
prod = 2
dev  = 1
}
description = "Number of nodes in each GKE cluster zone"
}

在gke/variables.tf我有:

variable "gke_num_nodes" {
type        = map
description = "Number of nodes in each GKE cluster zone"
}
variable gke_label {
type        = map
description = "label"
}

这过去工作得很好,但随着地形0.12的升级,结果是:

Error: Invalid value for module argument
on main.tf line 78, in module "gke":
78:   gke_num_nodes         = "var.gke_num_nodes"
The given value is not suitable for child module variable "gke_num_nodes"
defined at gke/variables.tf:15,1-25: map of any single type required.

Error: Invalid value for module argument
on main.tf line 84, in module "gke":
84:   gke_label             = "var.gke_label"
The given value is not suitable for child module variable "gke_label" defined
at gke/variables.tf:40,1-19: map of any single type required.

我更改了gke/variables.tf(与num_nodes相同(

variable gke_label {
type        = map(any)
description = "label"
}

但是错误仍然是

Error: Invalid value for module argument
on main.tf line 84, in module "gke":
84:   gke_label             = "var.gke_label"
The given value is not suitable for child module variable "gke_label" defined
at gke/variables.tf:40,1-19: map of any single type required.

如何将这些地图变量更新为地形0.12?

这个Terraform 0.12代码将按预期分配值(而不是文字字符串(:

gke_num_nodes         = var.gke_num_node

在Terraform 0.11.x或Terraform 0.12中,如果在变量赋值周围使用引号而不使用插值,则它们将被视为字符串。

gke_num_nodes         = "var.gke_num_node"

上面的代码将文本字符串"var.gke_num_node"分配给模块中的gke_num_nodes,而不是按照您的意愿分配var.gke_num_nodes的值。由于字符串不可分配给映射(任何(,Terraform输出您提供的类型错误:

Error: Invalid value for module argument
on main.tf line 78, in module "gke":
78:   gke_num_nodes         = "var.gke_num_nodes"

在Terraform 0.11.x及更早版本中,您可以使用带${}的字符串插值来获得变量的值:

gke_num_nodes         = "${var.gke_num_node}"

Terraform 0.12中不赞成使用这种表达式,但在大多数情况下仍然有效。不要在Terraform 0.12中使用字符串插值,除非您正在从多个变量构建字符串。

通过移除${},您跳到了地形0.12的一半。通过删除引号来跨越剩余的差距,这样您的变量分配将按预期工作:

gke_num_nodes         = var.gke_num_node

以下是整个模块块,更正为删除引号:

module "gke" {
source                = "./gke"
region                = var.region
min_master_version    = var.min_master_version
node_version          = var.node_version
gke_num_nodes         = var.gke_num_node # [MAP VARIABLE]
vpc_name              = module.vpc.vpc_name
subnet_name           = module.subnet.subnet_name
gke_master_user       = var.gke_master_user
gke_master_pass       = var.gke_master_pass
gke_node_machine_type = var.gke_node_machine_type
gke_label             = var.gke_label   # [MAP VARIABLE]
}

最新更新