如何在IaC项目中作为一个团队管理Terragrunt和Terraform的多个版本

举报
kaliarch 发表于 2022/09/04 19:34:15 2022/09/04
【摘要】 Terragrunt和Terraform是DevOps生态系统中相对年轻的项目。因此,这两个项目都比我们喜欢的更经常地引入向后不兼容的更改。例如,Terraform状态即使在补丁版本级别(语义版本方案0.x.Y中的Y)也是不兼容的,以至于您无法跨不同补丁版本读取状态。事实上,Terraform有自动更新状态表示的功能(例如,使用0.12.17运行Terraform apply可以更新使用Te...

Terragrunt和Terraform是DevOps生态系统中相对年轻的项目。因此,这两个项目都比我们喜欢的更经常地引入向后不兼容的更改。例如,Terraform状态即使在补丁版本级别(语义版本方案0.x.Y中的Y)也是不兼容的,以至于您无法跨不同补丁版本读取状态。事实上,Terraform有自动更新状态表示的功能(例如,使用0.12.17运行Terraform apply可以更新使用Terraform 0.12.14创建的状态文件),但这是一个单向的改变:您不能降级到更低版本的状态文件!
这意味着一定要限制您的团队为给定的模块使用特定版本的Terraform和Terragrunt,以避免因为有人下载最新版本的Terraform而迫使整个团队升级。

在这篇文章中,我想分享生态系统中的几个工具和特性,这些工具和特性可以帮助您在团队级别管理多版本IaC项目。
以下是这篇文章将涵盖的内容:

  • 在模块中锁定兼容的Terraform版本
  • 使用tgswitch和tfenv安装多个版本的Terragrunt和Terraform
  • 利用TerraGrunt-version和。TerraForm-version实现基于文件夹的自动切换

在模块中锁定兼容的Terraform版本

我想分享的第一个特性是Terraform的本机特性,它允许您锁定给定模块支持的兼容版本。在模块代码中,可以添加一个terraform块,其中设置了required_version属性,以限制兼容的terraform版本。
例如,您可以添加以下块来限制模块的部署,使其仅允许Terraform版本0.12.17:

terraform { 
  # NOTE: The second `=` in the string is intentional, and it means
  # exactly version 0.12.17. In other words, we are setting the 
  # required_version property of the terraform block to "= 0.12.17".
  required_version = "= 0.12.17"
}

如果Terraform检测到您正在使用不兼容的Terraform版本,这将导致Terraform停止并出现错误,从而阻止您使用其他版本进行部署。通过将此块添加到直接部署的顶级模块中,可以确保您的团队仅使用指定的Terraform版本部署这些模块。
您可以在官方文档中阅读更多关于此功能的信息。
当您拥有与terraform_remote_state数据源相关联的依赖项时,顶级模块中的这种版本锁定非常有用,这些依赖项对Terraform版本非常敏感。
这种版本锁定级别的一个问题是,当您升级Terraform版本时,您将无法应用旧的环境。例如,您可能希望在开发环境中测试版本更改,从而强制您使用与其他环境中的模块旧版本不兼容的更新版本Terraform(例如prod,它可能在开发环境更新之前不会更新)。在这种情况下,除非安装并使用多个版本的Terraform,否则将失去管理prod环境的能力。

在下一节中,我将介绍生态系统中简化使用多个版本Terraform的工具。

使用tgswitch和tfenv安装多个版本的Terragrunt和Terraform

前面我们谈到了使用homebrew管理多个版本的Terraform。这在Mac上工作得很好,但与Terraform的用户不兼容,他们在其他基于Unix的机器上,如Linux或BSD。在本文中,我将介绍TerraForm/TerraGrunt生态系统中的两个工具,它们可以与任何Unix机器一起工作:tfenv(https://github.com/tfutils/tfenv)和tgswitch(https://github.com/warrensbox/tgswitch)。
tfenv的灵感来自一个类似的工具rbenv,它可以用来管理Ruby版本。这些是一组bash脚本,提供了管理和使用多个版本的受支持工具的工作流。
tgswitch是一个用golang编写的工具,它为TerraGrunt的版本控制提供了类似的特性。它提供了与tfenv相同的特性,包括管理要在版本文件中使用的版本。
当您安装这些工具之一时,您可以轻松地安装和切换二进制文件的版本。例如,要使用tfenv安装terraform的特定版本(0.12.17),需要执行以下操作:

tfenv install 0.12.17

然后,可以使用tfenv use命令在版本之间切换:

tfenv use 0.12.17
# terraform is now pointing to the 0.12.17 version
terraform version
# Switch to 0.12.14
tfenv use 0.12.14
terraform version

这些工具的工作方式如下:

  • 您的主文件夹中有一个目录(通常称为。xxenv,其中XX代表您管理的任何工具,比如rb代表rbenv,tf代表tfenv)充当工具的工作目录。请注意,对于tgswitch,工作目录略有不同(.terragrunt.versions),但工作方式大致相同。
  • 在工作目录中,该工具将安装二进制文件的多个版本。例如,tfenv将在.tfenv/versions/version_number下安装不同版本的terraform。
  • 每个工具都有一个目标二进制文件的shim版本,它将自动选择要使用的正确版本,可以在。xxenv/bin下获得。
  1. 环境变量XXENV_VERSION(对于tfenv来说,这是TFENV_VERSION,对于rbenv来说,这是RBENV_VERSION)
  2. 文件的内容。工具版本。工具取决于工具。例如,tgswitch使用。terragrunt-version,而tfenv使用。terraform-version。注意,通常每个XXenv工具都支持在目录树中遍历。
  3. 文件的内容。xxenv/version。

使用tgswitch和tfenv大大简化了安装和在多个版本之间切换的过程,但知道切换到什么版本仍然是一个手动过程。例如,您可能在模块上有require_version设置,并且您当前使用的可能是不兼容的Terraform版本。只有在运行terraform apply并看到错误后才会发现这一点。
在下一节中,我将介绍如何使用版本文件根据您所在的文件夹自动切换版本。

利用。TerraGrunt-version和。TerraForm-version实现基于文件夹的自动切换

如上一节所述,tgswitch和tfenv支持基于版本文件自动切换版本(tgswitch的.terragrunt-version和tfenv的.terraform-version)。您可以利用这些优势自动为项目使用正确版本的二进制文件。
假设您有以下典型的Terragrunt文件夹结构:

infrastructure-live
├── non-prod
│   └── us-east-1
│       ├── qa
│       │   ├── mysql
│       │   └── webserver-cluster
│       └── stage
│           ├── mysql
│           └── webserver-cluster
└── prod
    └── us-east-1
        └── prod
            ├── mysql
            └── webserver-cluster
infrastructure-modules
├── asg-elb-service
└── mysql

在本例中,让我们假设我们有混合的terraform版本需求,因此在非prod中,我们使用的基础设施模块的版本已经更新到terraform 0.12.17,而在prod中,我们仍然使用terraform 0.11.14。反过来,我们仍然在prod中使用Terragrunt 0.18.7,但在非prod中使用0.21.0来支持TerraForm12。
如果团队中的每个人都通过创建版本文件来使用tgswitch和tfenv,我们可以隐式地强制这些版本约束。在此模型中,您将希望在基础设施中的环境文件夹根部创建两个版本文件(.terragrunt-version和.terraform-version),如下所示:

infrastructure-live
├── non-prod
│   ├── .terragrunt-version
│   ├── .terraform-version
│   └── us-east-1
│       ├── qa
│       │   ├── mysql
│       │   └── webserver-cluster
│       └── stage
│           ├── mysql
│           └── webserver-cluster
└── prod
    ├── .terragrunt-version
    ├── .terraform-version
    └── us-east-1
        └── prod
            ├── mysql
            └── webserver-cluster

版本文件的内容将是该环境的版本:

#Infrastructure-live/non-prod/.Terragrunt-
0.21.0
#基础设施-live/non-prod/.Terraform-版本
0.12.17
#基础设施-live/prod/.terragrunt-版本
0.18.7
#Infrastructure-live/prod/.Terraform-版本
0.11.14

通过添加这些版本文件,tgswitch和tfenv的用户在调用这些实用程序时将自动使用正确的terragrunt和terraform版本。
正如在infrastructure-live/non-prod/us-east-1/qa/mysql中运行terragrunt apply时,tgswitch将自动选择terragrunt的0.21.0(因为它将在目录树中查找.terragrunt-version),而tfenv将自动选择terraform的0.12.17(因为它将在目录树中查找.terraform-version),而不管用户当前使用use命令选择了什么作为默认版本。
类似地,当您在infrastructure-live/prod/us-east-1/qa/mysql中运行terragrunt apply时,tgswitch将自动选择terragrunt的0.18.7,tfenv将自动选择Terraform的0.11.14。

其他工具

请注意,tgswitch和tfenv并不是提供此功能的唯一工具。在这里,我将列出属于这类版本管理的其他一些工具。您可能希望使用不同的工具,这取决于您的风格或环境(例如,tfenv是一个基于bash的工具,不能在Windows环境中使用,因此您可能希望使用tfswitch)。

总结

把它绑在一起:
在terraform块上使用required_version来限制模块只能从特定的terraform版本部署,以确保状态兼容性。
使用tgswitch和tfenv可以更容易地分别使用多个版本的terragrunt和terraform。
在项目中使用版本文件(.terragrunt-version和.terraform-version)可以根据部署的模块自动切换版本。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。