Поскольку вторая конфигурация работает со значениями по умолчанию для переменной, проблема не в конфигурации, проблема должна быть в terraform apply -var
. Это очень сложно сделать правильно и имеет ряд проблем: c взаимодействия с правилами синтаксического анализа оболочки, которые могут вас сбить с толку.
Я считаю использование файлов .tfvars гораздо более надежным и Я больше не пытаюсь заставить -var работать для моей работы с Terraform.
terraform.tfvars:
storageProfile2 = {
storage_mb = 102400
backup_retention_days = 15
geo_redundant_backup_enabled = false
administrator_login = "pgadmin1223"
}
Ceate terraform.tfvars, как указано выше, в том же каталоге, а затем запустить terraform plan
и terraform apply
без -var. Это должно решить вашу проблему.
Исходный ответ
В поставщике azurerm есть несколько существенных изменений, которые должны быть обратно совместимы, но, вероятно, вызывают проблему здесь.
geo_redundant_backup является устаревшим атрибутом начиная с v2.7.0 или v2.10.0 в зависимости от того, какой ресурс базы данных вы используете. Вместо этого вы должны использовать geo_redundant_backup_enabled и указать его как логическое ( bool type). Я подозреваю, что обратная совместимость не совсем надежна.
storage_profile также устарели, и все их атрибуты теперь находятся на верхнем уровне соответствующего.
примеры в документации поставщика azurerm с использованием storage_profile
неверны, и это:
storage_profile {
storage_mb = var.storageProfile2.storageMb
backup_retention_days = var.storageProfile2.backupRetentionDays
geo_redundant_backup = var.storageProfile2.geoRedundantBackup
}
Следует переписать как (прямые свойства ресурса, а не внутри блока):
storage_mb = var.storageProfile2.storageMb
backup_retention_days = var.storageProfile2.backupRetentionDays
geo_redundant_backup_enabled = var.storageProfile2.geoRedundantBackup
И ваше объявление переменной storageProfile2 должно быть обновлено, чтобы установить тип geoRedundantBackup на bool :
variable storageProfile2 {
default = {
storageMb = 102400
backupRetentionDays = 15
geoRedundantBackup = false
}
type = object({ storageMb=number, backupRetentionDays=number, geoRedundantBackup=bool })
}
Поскольку провайдер azurerm v2.7.0 была выпущена 23 апреля 2020 года, включая следующие изменения:
- azurerm_postgres_server - все свойства в блоке
storage_profile
перемещены на верхний уровень ( # 6459 ) - azurerm_postgres_server - следующие свойства были переименованы и изменены на логический тип:
ssl_enforcement
на ssl_enforcement_enabled
, geo_redundant_backup
на backup_geo_redundant_enabled
и auto_grow
на auto_grow_enabled
( # 6459 )
Поскольку провайдер azurerm v2.10.0 был выпущен 12 мая 2020 г., дополнительные storage_profile были сглажены:
- azurerm_mariadb_server - все свойства в блоке
storage_profile
перемещены на верхний уровень ( # 6865 ) - azurerm_mysql_server - все свойства в
storage_profile
блок перемещен на верхний уровень ( # 6833 ) - azurerm_mariadb_server - следующие свойства были переименованы и изменены на логический тип:
ssl_enforcement
на ssl_enforcement_enabled
, geo_redundant_backup
на geo_redundant_backup_enabled
и auto_grow
azurerm_mysql_server
- поддержка свойства create_mode
, позволяющая создавать реплики, восстановление на момент времени и геовосстановление ( # 6833 ) - azurerm_mysql_server - следующие свойства были переименованы и изменены на логический тип:
ssl_enforcement
на ssl_enforcement_enabled
, geo_redundant_backup
на geo_redundant_backup_enabled
и auto_grow
на auto_grow_enabled
(# 6833)
Помимо: Стиль кода
Обычный стиль кода в Terraform:
- Использовать
snake_case
вместо camelCase
(не формализовано, но каждый провайдер следует этому, как и примеры) - Цитируйте имена верхнего уровня, такие как имена ресурсов и переменных
- Выровняйте знаки равенства в группах ( без нескольких разрывов строки между ними)
variable "storage_profile_2" {
default = {
storage_mb = 102400
backup_retention_days = 15
geo_redundant_backup_enabled = false
}
type = object(
{
storage_mb = number
backup_retention_days = number
geo_redundant_backup_enabled = bool
}
)
}
И назначьте атрибуты следующим образом
storage_mb = var.storage_profile_2.storage_mb
backup_retention_days = var.storage_profile_2.backup_retention_days
geo_redundant_backup_enabled = var.storage_profile_2.geo_redundant_backup_enabled
Чем более согласован код Terraform в глобальном масштабе, тем проще будет для всех нам, практикующим, если нам когда-нибудь понадобится работать над чужим кодом.