我以前在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]
}