Как получить объект из списка объектов в Terraform? - PullRequest
0 голосов
/ 31 августа 2018

У меня есть следующий список переменных объекта:

variable "objects" {
  type = "list"
  description = "list of objects
  default = [
      {
        id = "name1"
        attribute = "a"
      },
      {
        id = "name2"
        attribute = "a,b"
      },
      {
        id = "name3"
        attribute = "d"
      }
  ]
}

Как получить элемент с id = "name2"?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Нельзя вложить несколько уровней в квадратные скобки, чтобы получить n уровней внутри структуры данных. Однако вы можете использовать функции интерполяции для получения таких значений. В этом случае вы захотите использовать функцию поиска для извлечения значения из карты, к которой к нему обращались в квадратных скобках, которая будет выглядеть следующим образом ...

${lookup(var.objects[1], "id")}

Rowan верна, со сложными структурами данных трудно работать в текущих версиях Terraform. Однако, похоже, пройдет немного времени, прежде чем мы сможем ожидать лучшей поддержки в этой области. Следующая версия 0.12 будет включать расширенные типы , добавляющие улучшения в списки и карты.

0 голосов
/ 02 сентября 2018

Если вы хотите создать набор vsphere_virtual_machine ресурсов из списка IP-адресов и имен хостов, я мог бы попробовать это:

resource "vsphere_virtual_machine" "vm" {
  count = "${length(var.virtual_machine_ips)}"

  // the rest of your virtual machine config
  // such as template ID, CPUs, memory, disks...

  vapp {
    properties {
      // your vApp properties may vary based on what your template actually is.
      // these examples are for the CoreOS template.

      "guestinfo.hostname" = "${index(var.virtual_machine_hostnames, count.index)}"
      "guestinfo.interface.0.ip.0.address" = "${index(var.virtual_machine_ips, count.index)}"
    }
  }
}

(Предполагается, что вы устанавливаете IP и имя хоста через vApp config ; если нет, то это может выглядеть аналогично, но поместите имя хоста и IP-адреса где-нибудь за пределами блока vsphere_virtual_machine.vapp.properties.)

Где файл terraform.tfvars может выглядеть так:

virtual_machine_ips = ["10.0.2.2", "10.0.2.3", "10.0.2.4"]
virtual_machine_hostnames = ["banana", "pineapple", "coconut"]

Это более простой и более идиоматический способ выполнения того, что вы пытаетесь сделать, поскольку работать со сложными объектами в синтаксисе интерполяции Terraform непросто.

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