我有一些共享的terraform模块,目前许多基于terraform 0.11的项目都在使用这些模块。我想逐步将项目迁移到0.12,并尝试保持模块与0.11和0.12的兼容性。 我在使用列表属性时遇到了麻烦,列表属性已经从使用方括号语法更改了。
在Terraform 0.11中,需要在单个表达式周围使用方括号,以便向语言解释器提示需要列表解释:
# Example for older versions of Terraform; not valid for v0.12
example = ["${var.any_list}"]
在terraform 0.12中,类似于上面的表达式现在将产生一个列表列表,从而对任何期望使用其他类型列表的参数产生类型检查错误。
# Example for Terraform v0.12
example = var.any_list
是否可以以与0.11和0.12兼容的方式设置列表属性?
答案 0 :(得分:0)
对于0.11和0.12都可以使用这种棘手的方法,
example = "${flatten(var.any_list)}"
我用aws_security_group中的cidr_blocks测试了Terraform v0.11.14和v0.12.4
variable "test" {
default = ["10.10.0.0/16", "10.20.0.0/16"]
}
resource "aws_security_group" "test" {
ingress {
from_port = 443
to_port = 443
protocol = "TCP"
cidr_blocks = "${flatten(var.test)}"
}
}
答案 1 :(得分:0)
原则上,在没有多余括号的情况下编写它应该在Terraform 0.11和0.12中都可以正常工作,如下所示:
example = "${var.any_list}"
不幸的是,由于Terraform 0.11的限制,如果var.any_list
包含计划时间未知的任何值,则此操作将失败,因为Terraform 0.11不会将未知值视为有效列表。多余的多余括号是解决此限制的常用解决方法,但不是有意提供的功能:除此错误外,自Terraform 0.7以来就不再需要多余的列表括号,并且仅支持与Terraform 0.6及更低版本的向后兼容性。>
话虽如此,如果您的列表确实包含未知值,那么很遗憾,没有办法编写与两个版本都兼容的代码。最接近的事情是使用上面的形式,使用插值语法但不使用方括号,然后在第一个应用上使用-target
来强制Terraform创建var.any_list
依赖于首先,然后在后续应用中,该列表中应该没有未知值,因此它应该能够成功完成。这与count
中出现未知值的原理相同,即使在Terraform 0.12中也不允许。