地形图和对象变量作为输入

时间:2020-06-19 07:50:31

标签: terraform terraform0.12+

对于地图/对象变量中的任何字符串属性,命令行输入均存在问题。 以下配置适用于以下命令。但是现在我在对象变量中使用了任何字符串属性。失败

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

错误消息

enter image description here

2 个答案:

答案 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 planterraform 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_postgres_server-storage_profile块中的所有属性已移至顶层(#6459
  • azurerm_postgres_server-将以下属性重命名并更改为布尔类型:ssl_enforcementssl_enforcement_enabledgeo_redundant_backupbackup_geo_redundant_enabled,以及auto_grow到{{ 1}}(#6459

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_profilessl_enforcementssl_enforcement_enabledgeo_redundant_backupgeo_redundant_backup_enabled auto_grow-支持azurerm_mysql_server属性,允许创建副本,时间点还原和地理还原(#6833
  • azurerm_mysql_server-以下属性已重命名并更改为布尔类型:create_modessl_enforcementssl_enforcement_enabledgeo_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的输入时