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
}
}