Используйте for_each для создания нескольких дисков и их снимков с использованием ввода списка - PullRequest
1 голос
/ 24 апреля 2020

Я пишу код TF для создания нескольких дисков в GCP. Цель состоит в том, чтобы иметь код dry и иметь список в качестве входных данных.

Мой var app_disks имеет следующее определение

variable "app_disks" {
  type = list(object({
    name = string
    size = number
  }))
}

И в моем main.tf я использую переменная, подобная этой

  app_disks = [
    {
      name = loki
      size = 200
    },
    {
      name = repo
      size = 100
    }
  ]

И в моем модуле мой disk.tf выглядит следующим образом

locals {
  app_disk_map = {
    for disk in var.app_disks : "${disk.name}" => disk
  }
}

resource "google_compute_resource_policy" "app_disk_backup" {
  for_each = local.app_disk_map

  name   = "${each.value.name}-backup"

  snapshot_schedule_policy {
    schedule {
      hourly_schedule {
        hours_in_cycle = 8
        start_time     = "04:00"
      }
    }
    retention_policy {
      max_retention_days    = 14
      on_source_disk_delete = "APPLY_RETENTION_POLICY"
    }
  }
}

resource "google_compute_disk" "app_disk" {
  for_each = local.app_disk_map

  provider = google-beta

  name = each.value.name
  zone = "${var.region}-a"
  size = each.value.size

  resource_policies = [each.google_compute_resource_policy.app_disk_backup[${each.value.name}-backup].self_link]
}

Что я не уверен в этом, как связать resource_policies диска к его значению google_compute_resource_policy".

Я пробовал такие комбинации, как

each.google_compute_resource_policy.app_disk_backup[${each.value.name}-backup].self_link

each.google_compute_resource_policy.app_disk_backup."${each.value.name}-backup".self_link

Но, похоже, ни одна из них не работает

1 Ответ

1 голос
/ 25 апреля 2020

Я не совсем уверен, правильно ли я понял проблему (поскольку вывод ошибок отсутствует), но из того, что я понял, вы хотите получить следующую ссылку: google_compute_resource_policy.app_disk_backup[each.key].self_link, чтобы ресурс выглядел примерно так:

resource "google_compute_disk" "app_disk" {
  for_each = local.app_disk_map

....

  resource_policies = [google_compute_resource_policy.app_disk_backup[each.key].self_link]
}

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

...