Создание вложенных блоков параметров ресурса на основе условного в terraform - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь создать модуль terraform, который создает экземпляр compute. Я хочу, чтобы ресурс имел подключенный диск тогда и только тогда, когда у меня переменная attached_disk_enabled установлена ​​на true во время вызова модуля. У меня есть это:

resource "google_compute_disk" "my-disk" {
  name  = "data"
  type  = "pd-ssd"
  size  = 20
  count = var.attached_disks_enabled ? 1 : 0
}

resource "google_compute_instance" "computer" {
  name = "computer"

  boot_disk {
    ...
  }

  // How do I make this disappear if attached_disk_enabled == false?
  attached_disk {
    source      = "${google_compute_disk.my-disk.self_link}"
    device_name = "computer-disk"
    mode        = "READ_WRITE"
  }
}

Переменные были объявлены для модуля в vars.tf. Вызов модуля выглядит так:

module "main" {
  source                = "../modules/computer"
  attached_disk_enabled = false
  ...
}

Я знаю о динамических блоках и о том, как использовать цикл for для итерации по списку и установки нескольких блоков, но я не уверен, как исключить блок из ресурса, используя этот метод:

dynamic "attached-disk" {
  for_each in var.disk_list
  content {
    source      = "${google_compute_disk.my-disk.*.self_link}"
    device_name = "computer-disk-${count.index}"
    mode        = "READ_WRITE"
  }
}

Я хочу if вместо for_each. Есть ли способ сделать это?

$ terraform version
Terraform v0.12.0 

1 Ответ

0 голосов
/ 06 июня 2019

Поскольку к вашему дисковому ресурсу уже присоединено условное условие, вы можете использовать результат этого ресурса в качестве итератора и, таким образом, избежать повторного указания условного условия:

dynamic "attached_disk" {
  for_each = google_compute_disk.my-disk
  content {
    source      = attached_disk.value.self_link
    device_name = "computer-disk-${attached_disk.key}"
    mode        = "READ_WRITE"
  }
}

Чтобы ответить на общий вопрос: если вам нужно нужен условный блок, ответом является написание условного выражения, которое возвращает либо список из одного элемента, либо пустой список:

dynamic "attached_disk" {
  for_each = var.attached_disk_enabled ? [google_compute_disk.my-disk[0].self_link] : []
  content {
    source      = attached_disk.value
    device_name = "computer-disk-${attached_disk.key}"
    mode        = "READ_WRITE"
  }
}

Однако в вашей конкретной ситуации я бы предпочел первое, поскольку оно описывает намерение («прикрепить каждый из дисков») более непосредственно.

...