Terraform 是由 HashiCorp 开发的开源基础设施即代码(IaC)工具。它允许用户以代码的方式定义和管理基础设施,这样就可以使用代码创建、修改和删除基础设施资源,例如虚拟机、存储账户和网络。Terraform 使用 HashiCorp 配置语言(HCL)的声明性语言来定义基础设施资源,易于阅读和学习,适用于开发人员和运维团队。同时,Terraform 还支持其他配置语言,如 JSON 和 YAML。
Terraform 作为一个成熟的开源项目,拥有庞大的用户群体和活跃的社区,在 GitHub 上有接近 40k 星星🌟。
随着越来越多的企业使用云计算和实施自动化,使用可扩展、使其成为在可扩展、高效和一致的方式下管理基础设施变得越来越重要。Terraform 的关键特征在简化基础设施配置和管理方面发挥了关键作用。
Terraform 的核心功能之一是支持基础设施即代码。使用 Terraform,用户就能够使用可读的配置文件来定义和管理基础设施,并可以进行版本控制、自动化和文档化基础设施设置,更容易与团队成员合作,并确保在不同环境中保持一致性。同时,Terraform 使用 HashiCorp 配置语言(HCL),简化了配置文件的编写,使 Terraform 对开发人员和运维团队都更易访问。
Terraform 可以管理各种云提供商的资源。无论是在使用亚马逊云服务(AWS)、微软Azure、Google 云平台(GCP)或其他云提供商,Terraform 提供了一致的基础设施配置方法,消除了为每个平台学习不同的工具和语言的需求。
Terraform 的执行计划(execution plan)对于安全地管理基础设施至关重要。该计划描述了 Terraform 将做什么,并在开始任何基础设施更改之前请求批准。通过此步骤,用户可以在 Terraform 对基础设施执行任何操作(包括创建、更新或删除基础设施)之前查看更改,防止意外和潜在不安全的更改。
Terraform 的模块化设计促进了代码的可重用性和可维护性。用户可以创建和共享模块以抽象和简化基础设施组件。这种模块化方法简化了大型和复杂基础设施的管理,提高了一致性,并使扩展基础设施变得更加容易。
Terraform 维护状态文件,记录基础设施的当前状态。这个状态文件对于跟踪更改非常重要,用来确保期望的基础设施与实际基础设施相匹配。Terraform 自动处理状态管理,提供了一种可靠的方式来跟踪、审查和更新基础设施配置。
Terraform 的插件生态系统扩展了其功能,可以与各种服务和提供商一起使用。无论是需要集成数据库、DNS 服务、监控工具还是自定义内部解决方案,用户都可以找到插件或创建自己的插件来扩展 Terraform 的功能。
Terraform 社区庞大且活跃。用户可以访问丰富的资源,包括文档、论坛和教程。在这里,用户可以寻求帮助、分享经验,并在使用 Terrafom 时找到解决常见问题和挑战的解决方案,或与其他用户进行交流讨论。
Terraform 提供成熟且完善的入门/教程。用户可以根据设备和需求来选择相应的教程快速上手 Terraform。
安装 Terraform 的最简便方式就是使用操作系统的包管理器。访问 Terraform 官方文档(https://developer.hashicorp.com/terraform/tutorials/aws-get-started)查看各个操作系统上的安装说明。
要检查一切是否正常,请运行terraform 命令,这里还罗列了一些其他实用命令:
$ terraform
Usage: terraform [global options] <subcommand> [args]The available commands for execution are listed below.
The primary workflow commands are given first, followed by
less common or more advanced commands.Main commands:
init Prepare your working directory for other commands
validate Check whether the configuration is valid
plan Show changes required by the current configuration
apply Create or update infrastructure
destroy Destroy previously-created infrastructure
这里我们将在 AWS 上使用 Terraform 来配置基础设施,因此需要安装 AWS CLI。Terraform 使用 AWS CLI 进行 API 调用来执行预置任务。登录 AWS Web 控制台为 Terraform 创建用户,按照下方进行选择。
现在为该用户提供管理角色,建议在处理项目时遵循最小权限原则。
成功创建用户后,记得记录访问密钥 ID 和秘密访问密钥。
我们需要在刚刚安装的 AWS CLI 中配置这些凭证。打开终端并运行 aws configure命令来配置默认凭据。我已将该区域保留为默认值,因为我使用的是相同的区域。如果需要,请选择您选择的区域。
sumeetninawe@Sumeets-MacBook-Pro tf-tuts % aws configure
AWS Access Key ID [****************PYVK]: ****PYVK
AWS Secret Access Key [****************duMt]: ****duMt
Default region name [eu-central-1]:
Default output format [None]:
sumeetninawe@Sumeets-MacBook-Pro tf-tuts %
至此,我们已成功设置环境准备开始使用 Terraform 和 AWS。
注意:如果您硬编码凭证或使用其他方法访问 AWS,Terraform 无需 AWC CLI 即可进行 API 调用。
Terraform 在其应用程序架构中实现了模块化方法。我们下载的 Terraform 二进制文件是执行核心 Terraform 功能所需的核心模块。任何不涉及调用任何云提供商 API 的操作或 CLI 命令都是该二进制文件的核心功能。
为了与云提供商(在我们的示例中为 AWS)合作,Terraform 实例化了相应的模块。它将二进制文件下载到项目的根目录中。我们指定 Terraform 使用特定版本的AWS provider,以便 Terraform 项目可以配置 AWS 资源。
现在我们来创建 Terraform 项目。在系统中创建一个目录,然后在您选择的 IDE 中打开该路径。所有 Terraform 代码都会进入 .tf
在此目录的根目录中创建的文件中。创建第一个名 provider.tf
为此空目录的文件并编写提供程序块,如下所示。
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.19.0"
}
}
}
如前所述,Terraform 使用 HCL 语法。一种声明性配置语言,可帮助我们声明要使用 Terraform 配置的云资源。在 provider.tf
文件中,我们指定了一个 terraform block,在其中声明了另一个 block 代表 required_providers
。
required_providers
包含一个 attribute aws
,具有几个属性的对象被分配到该属性。这些属性定义了AWS provider 的 source
和需求的 version
。特定于提供商的文档保存在 registry 中。要检查可用提供程序的最新版本并使用 AWS 配置各种类型的资源,请参阅 Terraform registry 官方文档(https://registry.terraform.io/)。
上面的代码指示 Terraform 使用版本 4.19.0 初始化 AWS provider。保存 provider.tf
文件。现在在根目录中运行terraform init命令并观察如下输出以初始化 Terraform 项目:
sumeetninawe@Sumeets-MacBook-Pro tf-tuts % terraform init
Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/aws versions matching "~> 4.19.0"...
- Installing hashicorp/aws v4.19.0...
- Installed hashicorp/aws v4.19.0 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
sumeetninawe@Sumeets-MacBook-Pro tf-tuts %
如我们所见,Terraform 已成功初始化所需版本的 AWS provider。如果我们查看根目录,就会发现它包含以下内容。
除了provider.tf
和 README.md 文件之外,我们还有.
terraform.lock.hcl` 文件和一个名为.terraform的子目录。这里的锁定文件用于管理下载的模块二进制文件的校验。子目录用来下载 AWS provider 插件二进制文件。
如需了解更多 Terraform 上手教程,可参考官方文档(https://developer.hashicorp.com/terraform/docs)。