карта terraform и переменные объекта в качестве входных
Возникла проблема с вводом командной строки для любого строкового атрибута внутри переменной карты / объекта. приведенная ниже конфигурация работает с командой ниже. Но в тот момент, когда я использую любой строковый атрибут внутри объектной переменной. это не удается
terraform plan -var='storageProfile2={"storage_mb":102400,"backup_retention_days":15,"geo_redundant_backup_enabled":false}'
//main.tf
resource "azurerm_postgresql_server" "dmcdevops_postgress" {
name = "pstgressdb101"
location = azurerm_resource_group.dmc_rg_creation.location
resource_group_name = azurerm_resource_group.dmc_rg_creation.name
sku_name = "GP_Gen5_4"
backup_retention_days = var.storageProfile2.backup_retention_days
storage_mb = var.storageProfile2.storage_mb
geo_redundant_backup_enabled = var.storageProfile2.geo_redundant_backup_enabled
administrator_login = "sdfgsgfsg"
administrator_login_password = "H@Sh1CoR3!"
version = "11"
ssl_enforcement_enabled = true
}
//variables.tf
variable "storageProfile2" {
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
}
)
}
Конфигурация ниже не работает. Я просто добавилadministrator_login как строковый атрибут к объектной переменной. terraform plan and apply работает со значениями по умолчанию.
terraform plan -var='storageProfile2={"storage_mb":102400,"backup_retention_days":15,"geo_redundant_backup_enabled":false,"administrator_login":"pgadmin1223"}'
//main.tf
resource "azurerm_postgresql_server" "dmcdevops_postgress" {
name = "pstgressdb101"
location = azurerm_resource_group.dmc_rg_creation.location
resource_group_name = azurerm_resource_group.dmc_rg_creation.name
sku_name = "GP_Gen5_4"
backup_retention_days = var.storageProfile2.backup_retention_days
storage_mb = var.storageProfile2.storage_mb
geo_redundant_backup_enabled = var.storageProfile2.geo_redundant_backup_enabled
administrator_login = var.storageProfile2.administrator_login
administrator_login_password = "H@Sh1CoR3!"
version = "11"
ssl_enforcement_enabled = true
}
//varibale.tf
variable "storageProfile2" {
default = {
storage_mb = 102400
backup_retention_days = 15
geo_redundant_backup_enabled = false
administrator_login = "pgadmin"
}
type = object(
{
storage_mb = number
backup_retention_days = number
geo_redundant_backup_enabled = bool
administrator_login = string
}
)
}
Сообщение об ошибке
2 ответа
Поскольку вторая конфигурация работает со значениями по умолчанию для переменной, проблема не в конфигурации, terraform apply -var
должно быть проблема. Это очень сложно сделать правильно, и у него есть ряд проблемных взаимодействий с правилами синтаксического анализа оболочки, которые могут вас сбить с толку.
Я считаю, что использование файлов.tfvars намного более надежно, и я больше не пытаюсь заставить -var работать для моей работы с Terraform.
terraform.tfvars:
storageProfile2 = {
storage_mb = 102400
backup_retention_days = 15
geo_redundant_backup_enabled = false
administrator_login = "pgadmin1223"
}
Установите terraform.tfvars, как указано выше, в том же каталоге, а затем запустите terraform plan
а также terraform apply
без -var. Это должно решить вашу проблему.
Оригинальный ответ
В поставщике azurerm есть несколько существенных изменений, которые должны быть обратно совместимы, но, вероятно, вызывают здесь проблему.
geo_redundant_backup является устаревшим атрибутом начиная с v2.7.0 или v2.10.0 в зависимости от того, какой ресурс базы данных вы используете. Вместо этого вы должны использовать geo_redundant_backup_enabled и указать его как логическое значение (тип bool). Я подозреваю, что обратная совместимость не совсем надежна.
Блоки 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 мая, дополнительный storage_profile 2020 был сглажен:
- 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 в глобальном масштабе, тем легче будет всем нам, практикующим, если нам когда-нибудь понадобится работать над чужим кодом.
Как указал Мартин. Проблема заключалась в оболочке в стиле unix на оболочке питания. После выхода из двойных кавычек это сработало. Правильный синтаксис для Power Shell:
terraform plan -var='postgress={"storage_mb":102400,"backup_retention_days":15,"geo_redundant_backup_enabled":false,"administrator_login":\"pgadmin1223\"}'
Кроме того, я согласен, что лучше использовать tfvars вместо входных параметров, особенно если у вас много входных данных для терраформ.