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

举报
kaliarch 发表于 2023/07/16 10:49:08 2023/07/16
【摘要】 一 背景在IaC团队管理中,由于项目、环境、各云provider限制、团队协作治理需要统一的版本方案,在业界也有不少优秀的工具或方法,本文针对团队协助治理困境,给出几种实战破局方法,在实际团队中可根据实际情况进行选择。 二 概述本文分享生态系统中的几个工具和特性,这些工具和特性可以帮助您在团队级别管理多版本IaC项目。在模块中锁定兼容的Terraform版本;使用tgswitch和tfen...

一 背景

在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下获得。
  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)。

五 总结

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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