Как создать динамические c configmaps для Kubernetes без пустых данных? - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь создать kubernetes_config_map, используя for_each l oop, когда все данные находятся внутри переменной:

variables.tf:

variable "extra_configmaps" {
  type = list(object({
    name      = string
    namespace = string
    data      = object({})
  }))
  default = []
}

terraform.tfvars:

extra_configmaps = [
  {
    name      = "common"
    namespace = "production"
    data = {
      "somekey" = "somevalue"
    }
  }
]

main.tf:

resource "kubernetes_config_map" "extra_configmaps" {
  for_each = { for record in var.extra_configmaps : record.name => record }
  metadata {
    name      = each.key
    namespace = each.value.namespace
  }

  data = tomap(each.value.data)
}

Однако configmap создан без данных!

# kubernetes_config_map.extra_configmaps["common"] will be created
  + resource "kubernetes_config_map" "extra_configmaps" {
      + id = (known after apply)

      + metadata {
          + generation       = (known after apply)
          + name             = "common"
          + namespace        = "production"
          + resource_version = (known after apply)
          + self_link        = (known after apply)
          + uid              = (known after apply)
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Я знаю, data ожидает карта, но план не показывает его, хотя я его и предоставил.

Как создать динамические c configmaps для Kubernetes без пустых данных? Как создать динамические c configmaps для Kubernetes без пустых данных?

1 Ответ

2 голосов
/ 01 мая 2020

Вы указали, что ограничение типа атрибута data равно object({}), что является типом объекта вообще без атрибутов. Ограничения типа объекта требуют, чтобы по крайней мере присутствовали для заданных атрибутов, но поскольку вы не указали никаких атрибутов, это ограничение будет соответствовать любому значению объекта, но оно также отбросит все его атрибуты во время преобразование типа, потому что ни одно из них не указано в ограничении типа.

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

variable "aws_vpc" {
  type = object({
    id         = string
    cidr_block = string

    # aws_vpc's object type has many other attributes,
    # but this module only needs the two above so it
    # will accept and silently discard all of the
    # others. Caller can therefore do this:
    #     aws_vpc = aws_vpc.example
  })
}

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

variable "extra_configmaps" {
  type = list(object({
    name      = string
    namespace = string
    data      = map(string)
  }))
  default = []
}

Более подробная информация о правилах преобразования типов Terraform приведена в Преобразование сложных типов , которая является частью документации по Type Constraints .

...