can';t在terraform 0.12的子模块中声明映射变量

can';t在terraform 0.12的子模块中声明映射变量,terraform,terraform-provider-gcp,Terraform,Terraform Provider Gcp,我以前在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_la

我以前在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.
我不明白如何升级这些映射变量。关于这一点的文件(对我来说)不是特别清楚

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

├── 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中,我曾经/曾经(除其他外):

在variables.tf中(除其他外)

在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"
}
这过去工作正常,但随着terraform 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_节点相同)

但错误依然存在

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.

如何将这些映射变量更新为terraform 0.12?

此terraform 0.12代码将按预期分配值(不是文字字符串):

在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中使用字符串插值,除非您正在从多个变量构建字符串

通过删除
${}
,您跳到了Terraform0.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]
}

谢谢您为什么将“var.region”留在“”中?我知道这是一根弦,但对其他一些人来说也是如此。那是因为我的大脑不在。我来编辑。非常感谢。
Error: Invalid value for module argument

  on main.tf line 78, in module "gke":
  78:   gke_num_nodes         = "var.gke_num_nodes"
gke_num_nodes         = "${var.gke_num_node}"
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]
}