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
到自动增长
()自动增长启用
- 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\"}'