IaC团队多版工具高效治理实战
一 背景
在IaC团队管理中,由于项目、环境、各云provider限制、团队协作治理需要统一的版本方案,在业界也有不少优秀的工具或方法,本文针对团队协助治理困境,给出几种实战破局方法,在实际团队中可根据实际情况进行选择。
二 概述
本文分享生态系统中的几个工具和特性,这些工具和特性可以帮助您在团队级别管理多版本IaC项目。
- 在模块中锁定兼容的Terraform版本;
- 使用tgswitch和tfenv安装多个版本的Terragrunt和Terraform;
- 利用TerraGrunt-version和。TerraForm-version实现基于文件夹的自动切换。
三 实战
3.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环境的能力。
3.2使用tgswitch和tfenv安装多个版本的Terragrunt和Terraform
接下来介绍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并看到错误后才会发现这一点。
在下一节中,我将介绍如何使用版本文件根据您所在的文件夹自动切换版本。
3.3 利用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)