Terraform v0.12不再支持.tfvars文件中的块



从terraform 11升级到12,似乎在tfvars文件中不再支持块了。我们在每个环境中使用不同的tfvar文件,并且一些变量(如子网)根据环境而不同。

我们过去是根据帐号进行查找的。我们的UAT。tvars有以下内容:

global_vpc_subnets {
prod    = "subnet-96eb8ae1,subnet-d54cf78c"
nonprod = "subnet-badfc9de,subnet-dac2d5ac,subnet-0afc716f0974da5bc"
}

这些非prod子网只在这个环境中使用,我们在应用时指定了这个tfvar文件。我认为这完全没有必要;这只是一些已经完成的事情。

有谁知道这是否可以有一种方法来绕过地形破坏。当我升级后,我现在得到这个错误:

Unexpected "global_vpc_subnets" block
on uat.tfvars line 50:
50: global_vpc_subnets {
Blocks are not allowed here.

如果没有,我必须清除子网并移动资源,这将花费时间

正确的书写方式将取决于该变量的预期类型。

如果这个变量需要一个映射列表,那么你可以编写一个表达式来生成映射列表,如下所示:

global_vpc_subnets = [
{
prod    = "subnet-96eb8ae1,subnet-d54cf78c"
nonprod = "subnet-badfc9de,subnet-dac2d5ac,subnet-0afc716f0974da5bc"
}
]

如果变量只需要一个映射,那么你应该这样写:

global_vpc_subnets = {
prod    = "subnet-96eb8ae1,subnet-d54cf78c"
nonprod = "subnet-badfc9de,subnet-dac2d5ac,subnet-0afc716f0974da5bc"
}
.tfvars

文件中从未有意支持块语法,但由于底层语言解析器的模糊性,它在Terraform v0.11和更早的版本中碰巧可以工作。Terraform v0.12及以后版本要求您编写一个表达式,该表达式明确地生成所需类型的值。


在进行此升级时,我建议也抓住机会使该变量的类型约束特定,使用新的Terraform v0.12类型约束语法。

如果您打算接受一个映射列表:

variable "global_vpc_subnets" {
type = list(map(string))
}

如果您打算只接受一个映射:

variable "global_vpc_subnets" {
type = map(string)
}

考虑到这些逗号分隔的字符串似乎代表了子网ID字符串本身的集合,您也可以考虑通过使用map(set(string))来避免分割字符串的需要,但可能最好保存到完成初始v0.12升级之后,以避免同时更改太多东西。

最新更新