0
点赞
收藏
分享

微信扫一扫

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(github.com/tfutils/tfe… 和 tgswitch(github.com/warrensbox/… 。 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并看到错误后才会发现这一点。 在下一节中,我将介绍如何使用版本文件根据您所在的文件夹自动切换版本。

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)。

IaC团队高效治理多版本工具实战_Terra

  • tfswitch(tfswitch.warrensbox.com/): 工作方式与tgswitch相同,但管理terraform。
  • asdf-vm(asdf-vm.com/),特别是hashic…
  • tgenv(github.com/cunymatthie… 工作方式与tfenv相同,但管理terragrunt。最初在本文中推荐,但自最初发布日期以来就没有更新过。

五 总结

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

举报

相关推荐

0 条评论