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

Terraform 地形图和对象变量作为输入,terraform,terraform0.12+,Terraform,Terraform0.12+,映射/对象变量中任何字符串属性的命令行输入都有问题。 下面的配置与下面的命令配合使用。但是当我在对象变量中使用任何字符串属性时。它失败了 terraform plan -var='storageProfile2={"storage_mb":102400,"backup_retention_days":15,"geo_redundant_backup_enabled":false}' 下面的配置不起作用。我刚刚向对象变量添加了admin

映射/对象变量中任何字符串属性的命令行输入都有问题。 下面的配置与下面的命令配合使用。但是当我在对象变量中使用任何字符串属性时。它失败了

terraform plan -var='storageProfile2={"storage_mb":102400,"backup_retention_days":15,"geo_redundant_backup_enabled":false}'
下面的配置不起作用。我刚刚向对象变量添加了administrator\u login作为字符串属性。 地形规划和应用使用默认值tho

terraform plan -var='storageProfile2={"storage_mb":102400,"backup_retention_days":15,"geo_redundant_backup_enabled":false,"administrator_login":"pgadmin1223"}'
错误消息


由于第二个配置使用变量的默认值,因此配置不是问题所在,
terraform apply-var
必须是问题所在。这是一件非常棘手的事情,需要正确处理,并且与shell解析规则的交互有很多问题,可能会让您陷入困境

我发现使用更可靠,我不再试图让-var为我的地形工作

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\u redundant\u backup\u enabled,并将其指定为布尔值(bool类型)。我怀疑向后兼容性并不完全可靠

存储\u配置文件块也不推荐使用,它们的所有属性现在都是对应数据库的顶级属性

azurerm提供程序文档中使用存储配置文件的示例不正确,如下所示:

storage_profile {
  storage_mb            = var.storageProfile2.storageMb
  backup_retention_days = var.storageProfile2.backupRetentionDays
  geo_redundant_backup  = var.storageProfile2.geoRedundantBackup
}
应重写为(资源上的直接属性,而不是块内的直接属性):

您的storageProfile2变量声明应该更新,以将georedundbackup的类型设置为bool

variable storageProfile2 {
  default = {
    storageMb = 102400
    backupRetentionDays = 15
    geoRedundantBackup  = false
  }
  type = object({ storageMb=number, backupRetentionDays=number, geoRedundantBackup=bool })
}
自2020年4月23日发布以来,包括以下更改:

  • azurerm_postgres_服务器-存储配置文件块中的所有属性都已移动到顶层()
  • azurerm_postgres_服务器-以下属性已重命名并更改为布尔类型:
    ssl_强制执行
    ssl_强制执行启用
    geo_冗余备份
    backup_geo_redundant_enabled
    ,以及
    自动增长
    自动增长启用
    ()
自2020年5月12日发布以来,额外的存储配置文件被夷为平地:

  • azurerm\u mariadb\u服务器-存储配置文件块中的所有属性都已移动到顶层()
  • azurerm_mysql_服务器-存储配置文件块中的所有属性都已移动到顶层()
  • azurerm\u mariadb\u服务器-以下属性已重命名并更改为布尔类型:
    ssl\u强制执行
    ssl\u强制执行启用
    geo\u冗余备份
    geo\u冗余备份启用
    ,以及
    自动增长
    azurerm\u mysql\u服务器
    -支持
    create\u模式
    属性,允许创建副本、时间点恢复和地理恢复()
  • azurerm_mysql_服务器-以下属性已重命名并更改为布尔类型:
    ssl_强制执行
    ssl_强制执行启用
    geo_冗余备份
    geo_冗余备份启用
    ,以及
    自动增长
    自动增长启用
    (#6833)
旁白:代码风格 地形中的常规代码样式:

  • 使用
    snake\u case
    而不是
    camelCase
    (未正式化,但每个提供者都遵循这一点,就像示例一样)
  • 引用顶级名称,如资源名和变量名
  • 分组对齐等号(中间没有多个换行符的)
并按如下方式分配属性

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代码越一致,我们所有的从业者就越容易处理其他人的代码。

正如Martin指出的那样。问题是关于powershell上的unix样式shell。 在跳过双引号后,它成功了。 powershell的正确语法是

terraform plan -var='postgress={"storage_mb":102400,"backup_retention_days":15,"geo_redundant_backup_enabled":false,"administrator_login":\"pgadmin1223\"}'

另外,我同意最好使用TFVAR而不是输入参数,特别是如果您对terraforms有很多输入的话。我已经编辑了我的问题。我考虑过你的建议。我认为问题仍然在于输入参数。请检查编辑后的问题。@karas27我来看看。谢谢。请分享失败时收到的错误消息。您在这里分享的内容并不100%清楚,但这似乎是一个shell转义问题:我认为Terraform看到您的参数时,shell已经删除了所有引号
因此语法不再有效。在第一种情况下,它会起作用,因为碰巧省略属性名称上的引号是有效的,但普通表达式中未加引号的标识符被理解为引用,变量值中不允许引用。此处使用的引号适用于Unix样式的shell,但是,如果您使用的是非Unix样式的shell,如Windows命令提示符或PowerShell,那么它将无法工作。@MartinAtkins。你是对的。它在转义双引号后工作。我对这件事失去了理智。非常感谢。
variable storageProfile2 {
  default = {
    storageMb = 102400
    backupRetentionDays = 15
    geoRedundantBackup  = false
  }
  type = object({ storageMb=number, backupRetentionDays=number, geoRedundantBackup=bool })
}
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 plan -var='postgress={"storage_mb":102400,"backup_retention_days":15,"geo_redundant_backup_enabled":false,"administrator_login":\"pgadmin1223\"}'