当你在限制 Terraform 使用的版本时,请注意以下几点: – 只使用较小的版本限制。- 确保选择的版本与所需功能兼容。- 验证所选版本的稳定性。- 与团队成员协商确定适当的版本限制策略。- 在限制版本之前,确保备份相关文件

本文是2020年Z实验室圣诞日历的第11天文章。

首先

在我所在的团队中,使用Terraform进行开发环境的部署工作是由有空的成员来执行的操作。然而,由于每个人所安装的Terraform版本不同,在部署过程中会出现警告的问题。考虑到这一现实情况,我觉得将使用的版本统一到较小的版本是一个可行的解决方案。因此,我进行了调查,了解了Terraform的required_version设置,它可以限制使用的Terraform版本。

必需版本的规范

可以使用 required_version 来限制 Terraform 的使用版本。如果想要在次要版本上进行限制,可以按照以下方式定义。

# v0.13.x での実行を許可する
terraform {
  required_version = ">= 0.13.0, < 0.14.0"
}

即使使用上述的方法也没有问题,但通过使用箭头运算符(~>),可以简单地进行定义。

# v0.13.x での実行を許可する
terraform {
  required_version = "~> 0.13.0"
}

请注意

由于箭头运算符是评估最右边版本的规范,所以如果要允许在v0.13.x上运行,则需要定义为”~> 0.13.0″,而不是”~> 0.13″。需要注意的是,如果定义为”~> 0.13″,则设置允许v0.x.x上的执行,因此需要小心。

只允许右侧版本组件递增。

行动验证

在这里使用的设置如下所示。

# v0.13.x での実行を許可する
terraform {
  required_version = "~> 0.13.0"
}

首先,确认能在v0.13.4版本中执行该操作。

$ terraform --version
Terraform v0.13.4

# 正常終了
$ terraform init
$ terraform plan
$ terraform apply

我可以确认在v0.14.0版本中发现执行1会产生错误。

$ terraform --version
Terraform v0.14.0

# terraform plan/apply/destroy の実行も同様のエラーになる
$ terraform init

Error: Unsupported Terraform Core version

  on versions.tf line 10, in terraform:
  10:   required_version = "~> 0.13.0"

This configuration does not support Terraform version 0.14.0. To proceed,
either choose another supported Terraform version or update this version
constraint. Version constraints are normally set for good reason, so updating
the constraint may lead to other errors or unexpected behavior.

接下来我在v0.13.0版本上进行了测试,但出现了意料之外的错误。从错误信息中可以看出,使用的版本比状态文件中记录的版本要小,这是导致错误的原因。

$ terraform --version
Terraform v0.13.0

# terraform plan/apply/destroy の実行も同様のエラーになる
$ terraform init

Initializing the backend...
Error loading state: state snapshot was created by Terraform v0.13.4, which is newer than current v0.13.0; upgrade to Terraform v0.13.4 or greater to work with this state

当查看文件时,确实发现通过 v0.13.4 的执行,state 文件的版本中记录着 v0.13.4。

$ gsutil cat gs://tfstate/prometheus/default.tfstate
{
  "version": 4,
  "terraform_version": "0.13.4",
  "serial": 1,
  "lineage": "981102f2-3df4-999d-1a0e-b64259ce5353",
  "outputs": {},
  "resources": [
    ...
  ]
}

尝试使用v0.13.5版本(比记录在state文件中的v0.13.4更新)进行执行,确认可以顺利运行。

$ terraform --version
Terraform v0.13.5

# 正常終了
$ terraform init
$ terraform plan
$ terraform apply

不过,在上述操作中并未发生资源的变化(state 文件版本未发生变化),因此我试着进行了资源的重新创建。

$ terraform --version
Terraform v0.13.5

# 正常終了
$ terraform destroy
$ terraform plan
$ terraform apply

执行后检查状态文件后发现版本从v0.13.4更新到了v0.13.5。看起来这个版本似乎记录了最后一次执行时(最后一次修改状态文件的时机)的版本。

$ gsutil cat gs://tfstate/prometheus/default.tfstate
{
  "version": 4,
  "terraform_version": "0.13.5",
  "serial": 3,
  "lineage": "981102f2-3df4-999d-1a0e-b64259ce5353",
  "outputs": {},
  "resources": [
    ...
  ]
}

经过至此的操作验证,即使应用了允许在v0.13.x版本下运行的配置,实际上,我们发现最终的状态文件的更改取决于其版本。

# v0.13.x での実行を許可する
terraform {
  required_version = "~> 0.13.0" # この時点で事実上は v0.13.5 以上のバージョンでしか実行できない
}

总结

可以使用required_version来限制使用的版本为较小的次要版本,但实际上允许比最后执行的版本记录在state文件中的版本更大。因此,如果想要限制为较小的次要版本,建议应用以下设置,并实施“在资源更改时,如果出现小于state文件记录的版本的错误,可以更新补丁版本并进行资源更改”的操作规则。

terraform {
  required_version = "~> 0.13.0"
}

如果上述的运用规则不被接受,可以选择将其调整为最终执行版本,如下所示:

terraform {
  required_version = "~> 0.13.5"
}

我认为限制执行版本会更明智。

terraform {
  required_version = "= 0.13.5"
}

最后一句话

这次,我们介绍了使用 Terraform 的 required_version 设置来限制 Terraform 版本的情况下,将使用版本限制在次版本号的注意事项。虽然是小技巧,但如果对某人有所帮助,将不胜欣喜。

无论是Terraform还是其他软件的版本切换,asdf都是非常方便的工具(Banno/asdf-hashicorp)。
广告
将在 10 秒后关闭
bannerAds