Terraform: объявление структурированной / типизированной локальной или переменной

Я реализую сценарий Cloudflare Terraform, и у меня возникают проблемы с дедупликацией блока для zone_settings:

resource "cloudflare_zone_settings_override" "my-domain-settings-1" {
  zone_id = cloudflare_zone.my_domain1.id
  settings {
    # very_long_list_of_settings
  }
}

resource "cloudflare_zone_settings_override" "my-domain-settings-2" {
  zone_id = cloudflare_zone.my_domain2.id
  settings {
    # very_long_list_of_settings
  }
}

Блок настроек имеет ~60 строк, что полностью равнозначно. Я попытался реализовать это через foreach:

variable domains {
  default = [
    # ERROR: Variables may not be used here.
    cloudflare_zone.my_domain1,
    cloudflare_zone.my_domain2,
  ]
}

resource "cloudflare_zone_settings_override" "partners-zone-settings" {
  name = var.domains[count.index].name
  zone_id = var.domains[count.index].id
  settings {
    # very_long_list_of_settings
  }
}

(полный код: https://gist.github.com/knyttl/ee10aa7d63adda866fe39151a9e015d9)

Но это не удается Variables may not be used here. внутри блока переменных.

Я попробовал с местными жителями:

locals {
  zone_settings {
    # very_long_list_of_settings
    # ERROR: cannot have nested blocks
  }
}

resource "cloudflare_zone_settings_override" "my-domain-settings-1" {
  zone_id = cloudflare_zone.divadlouhasicu_cz.id
  # ERROR: An argument named "settings" is not expected here. Did you mean to define a block of type "settings"?
  settings = var.zone_settings
}

resource "cloudflare_zone_settings_override" "my-domain-settings-2" {
  zone_id = cloudflare_zone.divadlouhasicu_net.id
  # ERROR: An argument named "settings" is not expected here. Did you mean to define a block of type "settings"?
  settings = var.zone_settings
}

(полный код: https://gist.github.com/knyttl/76ff39f3baf68df19dfbd05a37eb0ea5)

Но это заканчивается ошибками в двух комментариях выше.

Есть ли вообще способ сделать это?

1 ответ

Чау Войто,

если у вас Terraform 12 или выше, вы можете использовать for_eachпостроить. В младшей версии выхода нет.

https://www.hashicorp.com/blog/hashicorp-terraform-0-12-preview-for-and-for-each

Код будет выглядеть примерно так (я не тестировал это, поэтому некоторые модификации почти наверняка потребуются):

variable domains {
  default = [
    # ERROR: Variables may not be used here.
    cloudflare_zone.my_domain1,
    cloudflare_zone.my_domain2,
  ]
}

resource "cloudflare_zone_settings_override" "my-domain-settings-1" {
  for_each = var.domains

  zone_id = each.value
  settings {
    # very_long_list_of_settings
  }
}
Другие вопросы по тегам