对于地图/对象变量中的任何字符串属性,命令行输入均存在问题。 以下配置适用于以下命令。但是现在我在对象变量中使用了任何字符串属性。失败
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规划和应用可使用默认值tho。
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
}
)
}
错误消息
答案 0 :(得分:2)
由于第二个配置使用变量的默认值,因此配置不是问题,terraform apply -var
必须是问题。正确行事是一件非常棘手的事情,并且与外壳解析规则进行了许多有问题的交互,可能使您绊倒。
我发现使用.tfvars files更加可靠,并且不再尝试让-var用于Terraform工作。
terraform.tfvars:
storageProfile2 = {
storage_mb = 102400
backup_retention_days = 15
geo_redundant_backup_enabled = false
administrator_login = "pgadmin1223"
}
在同一个目录中创建上述terraform.tfvars,然后在不使用-var的情况下运行terraform plan
和terraform apply
。它应该可以解决您的问题。
azurerm提供程序中有几项重大更改,这些更改旨在向后兼容,但很可能在此引起了问题。
geo_redundant_backup 是从v2.7.0或v2.10.0开始不推荐使用的属性,具体取决于所使用的数据库资源。您应该改用 geo_redundant_backup_enabled 并将其指定为布尔值(布尔类型)。我怀疑向后兼容并不完全可靠。
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 provider v2.7.0于2020年4月23日发布以来,包括以下更改:
自azurerm provider v2.10.0于2020年5月12日发布以来,附加的 storage_profile 已被扁平化:
- azurerm_mariadb_server-
auto_grow_enabled
块中的所有属性都已移至顶层(#6865)- azurerm_mysql_server-
storage_profile
块中的所有属性已移至顶层(#6833)- azurerm_mariadb_server-以下属性已重命名并更改为布尔类型:
storage_profile
至ssl_enforcement
,ssl_enforcement_enabled
至geo_redundant_backup
和geo_redundant_backup_enabled
auto_grow
-支持azurerm_mysql_server
属性,允许创建副本,时间点还原和地理还原(#6833)- azurerm_mysql_server-以下属性已重命名并更改为布尔类型:
create_mode
到ssl_enforcement
,ssl_enforcement_enabled
到geo_redundant_backup
,以及geo_redundant_backup_enabled
到{{ 1}}(#6833)
Terraform中的常规代码样式:
auto_grow
代替auto_grow_enabled
(尚未正式化,但是每个提供者都按照示例进行操作)snake_case
并按如下所示分配属性
camelCase
Terraform代码在全球范围内越一致,如果我们需要使用其他人的代码,对于我们所有人来说,它就越容易。
答案 1 :(得分:0)
如马丁所指出。问题是关于电源外壳上的Unix样式外壳。 在转义双引号后,它起作用了。 Power Shell的正确语法是
terraform plan -var='postgress={"storage_mb":102400,"backup_retention_days":15,"geo_redundant_backup_enabled":false,"administrator_login":\"pgadmin1223\"}'
此外,我同意最好使用tfvars代替输入参数,尤其是当您有很多对terraform的输入时