Terraform: заполнить объект разумным, затем частично переопределить? - PullRequest
1 голос
/ 20 июня 2019

Я ищу способ иметь переменную типа «объект» (для форсирования определенной структуры), а затем переопределить определенные части.рассмотрим объявление этой переменной:

variable "prod_vpc" {
  type = object({
        name = string,
        region = string,
        single_nat_gw = bool,
        create = bool,
        supernet = string
    })

  default = {
    name = "PROD"
    region = "eu-central-1"
    single_nat_gw = true
    create = false,
    supernet = "0.0.0.0/0"
  }
}

в этом случае, я мог бы захотеть иметь это в моих auto.tfvars:

prod_vpc = {
    create = true,
    supernet = "10.0.8.0/24"
}

, потому что все остальные значения хороши как есть.единственный способ, о котором я могу думать, это сделать это с помощью type = map (string) и условных выражений в блоке locals, то есть:

variable "vpc_defaults" {
  type = object({
        name = string,
        region = string,
        single_nat_gw = bool,
        create = bool,
        supernet = string
    })

  default = {
    name = "PROD"
    region = "eu-central-1"
    single_nat_gw = true
    create = false,
    supernet = "0.0.0.0/0"
  }
}


variable "prod_vpc" {
  type = map(string)
  default = {}
}

затем

prod_vpc = {
    create = true,
    supernet = "10.0.8.0/24"
}

и затем:

locals {
    create = coalesce(var.prod_vpc["create"], vpc_defaults.create)
}

(я не пробовал этого, но я думаю, что что-то в этом роде должно работать)

есть ли другие идеи для предопределения значений по умолчанию и переопределения только при необходимости?

С уважением

Рубен

1 Ответ

1 голос
/ 20 июня 2019

Даже если бы вы использовали простую карту, а не тип объекта, это было бы невозможно сделать таким образом, и причины изложены в документах здесь . Там предлагается использовать locals вместо значений по умолчанию, а затем явно объединить их.

Между тем, как заметил Джеймс Бардин в этой связанной с GitHub проблеме, ключи объекта требуются для установки значения по умолчанию. Если вы хотите, чтобы они были null, то вы должны явно установить их как таковые.

Джеймс добавил:

У вас также есть возможность установить значение по умолчанию как нулевое (или не иметь значения по умолчанию и требовать от вызывающего абонента установить значение). Однако в этом случае вам нужно избегать передачи нулевого объекта в слияние, что можно сделать с помощью условия или объединения:

merged_map_keys = merge(local.default_map_keys, coalesce(var.prod_vpc, {}))

Было бы хорошо , если бы вы могли сделать что-то вроде этого:

variable "prod_vpc" {
  type = object({
    name          = string,
    region        = string,
    single_nat_gw = bool,
    create        = bool,
    supernet      = string
  })
  default = {}
}

locals {
  default_map_keys = {
    name          = "PROD"
    region        = "eu-central-1"
    single_nat_gw = true
    create        = false,
    supernet      = "0.0.0.0/0"
  }
  merged_map_keys = merge(local.default_map_keys, var.prod_vpc)
}

Тогда вы можете позвонить с помощью:

prod_vpc = {
  create   = true,
  supernet = "10.0.8.0/24"
}

В открытом выпуске GitHub больше информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...