не может объявить переменные карты в дочерних модулях в terraform 0.12 - PullRequest
1 голос
/ 25 апреля 2020

Раньше у меня были (рабочие) переменные карты в 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 У меня было / есть (среди прочих):

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]
}

и в variables.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"
}

Раньше это работало нормально, но с обновлением до 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_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.

Как обновить эти переменные карты до terraform 0.12?

1 Ответ

2 голосов
/ 26 апреля 2020

Этот код 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 как вы и собираетесь. Поскольку string нельзя назначить для map (any) , 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, если вы не строите строку из нескольких переменных.

Вы прыгнули на полпути к Terraform 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]
}
...