结构化Terraform项目
关于如何为Terraform项目构造Git存储库的一般指导。
什么是Terraform
HashiCorp Terraform是一个作为代码工具的基础设施,它允许您在可读的配置文件中定义云资源和在线资源,您可以对这些文件进行版本化、重用和共享。然后,您可以使用一致的工作流在整个生命周期中提供和管理所有基础结构。
原则
1.固定Terraform和Provider的版本
约定是您将terraform和provider版本绑定在main.tf或providers.tf中,如果您从早期版本的terraform迁移,您可能会创建一个名为versions.tf的文件。
您可以精确地或松散地pin提供程序版本。如果松散地绑定,则可以将锁文件提交给将绑定提供程序的源代码管理。
您可以精确地或松散地钉入terraform版本。如果使用松散的pin,可以使用tfenv管理多个版本的Terraform。
https://www.terraform.io/language/modules/develop/structure
2.使用一致的命名。
使用snake大小写来命名文件和资源。资源名称应标识正在创建的资源,而不重复资源类型。
3.什么变量
在声明变量时,定义类型和描述是个好主意。有时,设置一个合理的默认值和对变量内容的一些验证是很有用的。
https://www.terraform.io/language/values/variables
4.按生命周期划分项目。
您的Terraform项目的大小可能不同,就像现有的单存储库与多存储库的争论一样,对于如何分解项目没有严格的定义。
我喜欢把资源从它们的生命周期中分离出来。如果您有一个使用Amazon Elastic Container Service(ECS)和Amazon Relational Database Service(RDS)的3层web应用程序,那么Amazon Virtual Private Cloud(VPC)比数据库或容器编排层更不可能发生变化。然而,运行在ECS集群中的应用程序将经常发生变化,因此在这个场景中,我将有3个独立的项目,每个项目都在自己的存储库中。
5.使用modules
Terraform注册表中有丰富的远程模块可用于您的项目。您还可以决定生产自己的Terraform模块,并将其托管在您的SCM解决方案中。
您还可以在解决方案中使用本地模块,使用本地模块可以创建可重用的组件,也可以使用模块分解较大的解决方案。
模块应该全部存储在解决方案根目录中的Modules目录中。
6.保护完整README
自述文件是一个活生生的文档,与它所记录的代码最接近,包括指向您所使用的任何外部资源或示例的链接,以及如何使用和部署解决方案的详细信息,无论是从客户端计算机还是通过CICD管道。
Terraform-Docs是在自述文件中生成部分的有用工具。
7.使用for_each来计数count
Count可以用于有条件地创建资源,但是对于创建多个资源,应该首选for_each。使用for_each将创建一个映射,其中创建的资源由命名索引而不是无序列表的编号索引访问。
8.使用远程状态来做为锁
默认情况下,Terraform在本地将状态存储在名为Terraform.tfstate的文件中。在团队中使用Terraform时,使用本地文件会使Terraform的使用变得复杂,因为每个用户在运行Terraform之前必须确保他们始终拥有最新的状态数据,并确保没有其他人同时运行Terraform。
使用remote state,Terraform将状态数据写入远程数据存储,然后可以在团队的所有成员之间共享。Terraform支持在Terraform Cloud、HashiCorp Consult、Amazon S3、Azure Blob Storage、Google Cloud Storage、阿里云OSS等平台上存储状态。
对于功能齐全的远程后端,Terraform还可以使用状态锁定来防止Terraform在同一状态下并发运行。
9.用工具验证项目。
为了提高部署的速度和成功,在开发周期的早期使用工具。
Terraform内置了一些工具来提供帮助:
terraform validate
terraform fmt — recursive
terraform plan
还有一些有用的外部工具可以提供帮助:
tflint — https://github.com/terraform-linters/tflint
checkov — https://www.checkov.io/
tfsec — https://github.com/aquasecurity/tfsec
infracost — https://www.infracost.io/
pre-commit — https://pre-commit.com/
10.自动化计划。
Terraform是DevOps方法学的基础IAC工具,CICD是另一个关键概念。当开始一个新项目时,请记住解决方案将通过自动化部署并部署到多个环境中。
给资源指定唯一的名称,使用变量,如果使用工作区,则使用TerraForm.Workspace,并生成唯一的值。
这是一个Terraform模板,可用于启动新的AWS项目。这包括以上列出的所有原则的加速器
- 点赞
- 收藏
- 关注作者
评论(0)