如何在IaC项目中作为一个团队管理Terragrunt和Terraform的多个版本
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下获得。
- 环境变量XXENV_VERSION(对于tfenv来说,这是TFENV_VERSION,对于rbenv来说,这是RBENV_VERSION)
- 文件的内容。工具版本。工具取决于工具。例如,tgswitch使用。terragrunt-version,而tfenv使用。terraform-version。注意,通常每个XXenv工具都支持在目录树中遍历。
- 文件的内容。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)。
- tfswitch(https://tfswitch.warrensbox.com/):工作方式与tgswitch相同,但管理terraform。
- asdf-vm(https://asdf-vm.com/),特别是hashicorp插件和terragrunt插件:面向插件的工具版本管理器。在单一界面下支持广泛的工具和语言。
- tgenv(https://github.com/cunymatthieu/tgenv):工作方式与tfenv相同,但管理terragrunt。最初在本文中推荐,但自最初发布日期以来就没有更新过。
总结
把它绑在一起:
在terraform块上使用required_version来限制模块只能从特定的terraform版本部署,以确保状态兼容性。
使用tgswitch和tfenv可以更容易地分别使用多个版本的terragrunt和terraform。
在项目中使用版本文件(.terragrunt-version和.terraform-version)可以根据部署的模块自动切换版本。
- 点赞
- 收藏
- 关注作者
评论(0)