Terraform 0.11列表属性与terraform 0.12兼容

时间:2019-07-19 17:29:48

标签: terraform

我有一些共享的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兼容的方式设置列表属性?

2 个答案:

答案 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中也不允许。