基础设施即代码(Infrastructure as Code,IaC)是一种通过代码来自动化配置与管理基础设施的方式。虽然可以通过物理硬件配置和交互式配置工具来交付基础设施,但 IaC 具备诸多优势,例如版本控制、可重复性和可扩展性。在众多 IaC 工具中,Terraform 是其中的佼佼者。它由 HashiCorp 于 2014 年推出,现已被全球超过 50 万家组织使用。下面我们来深入了解 Terraform 的工作原理,以及如何将其用于现代 IT 运维。
在开始学习 Terraform 之前,需要说明的是:至少熟悉一家主流云服务提供商(AWS、Azure、Google Cloud 等)是前提条件,因为 Terraform 用于管理云基础设施。如果您是云计算新手,可以先学习我们的 Understanding Cloud Computing 课程打下坚实基础。
Terraform 是一款开源工具,允许您使用高级配置语言来定义基础设施组件及其关系。
在 Terraform 具备可读性的配置文件中,您可以声明基础设施的目标状态,Terraform 会自动计算如何到达该状态。这些文件可以进行版本管理、共享与复用,从而以一致的方式管理您的基础设施,从计算与存储资源到 DNS 和 SaaS 功能。
Terraform 可用于多种云提供商、多云架构以及本地环境。
让我们更近一步,了解使 Terraform 脱颖而出的核心要点:
HashiCorp 配置语言
Terraform 使用一种名为 HashiCorp 配置语言(HCL)的高级语言,专为定义基础设施即代码而设计。高级配置语言采用声明式语法,相较于底层脚本与手动配置,更抽象也更易用。您可能已经在 YAML 或 JSON 文件中接触过类似的高级语言。
HCL 采用块结构,每个嵌套块代表资源及其配置。资源会以名称和属性显式定义。
resource "aws_instance" "example" {
ami = "ami-123456"
instance_type = "t2.micro"
}技术支持
执行计划
在定义好基础设施的目标状态后,Terraform 会生成一份执行计划。该计划会列出 Terraform 为达成该状态所需采取的步骤,便于您在应用之前审查变更。应用前检查计划可以避免不必要的修改,例如误删资源。
状态管理
Terraform 维护一个状态文件,用于自动跟踪您当前的基础设施状态,并在决定需要进行哪些变更时作为权威依据。默认情况下,该文件本地存储,名称为 terraform.tfstate。
提供商
提供商是与云平台及其他服务的 API 交互的插件,允许 Terraform 管理各类资源。官方提供商由 HashiCorp 及其可信合作伙伴(如 AWS、Azure、Google Cloud、Github、Datadog 等)开发和维护。社区也有大量插件,可在 Terraform Registry 或 Github 上找到。
资源图
Terraform 会构建一张资源图,展示基础设施中的资源及其之间的关系。该图帮助 Terraform 有效生成计划、处理资源之间的依赖关系,并确保以正确的顺序创建、更新和删除资源。这张图也有助于可视化您的基础设施,并理解您计划改动所带来的影响。
示例资源图。来源:HashiCorp 文档
让我们一起走完第一个 Terraform 工作流 。如果您对 DevOps 或云计算尚不熟悉,建议先学习我们的 Understanding Cloud Computing 和 Introduction to DevOps 课程,再继续往下。
安装与设置
在本教程中,我们将于 AWS 上创建资源。如果您想跟着操作但尚无账户,请前往 AWS 注册。
从官方网站下载 Terraform 。选择适用于您操作系统的二进制文件,并按照安装说明进行安装。
安装完成后,打开一个新的终端窗口,运行 terraform -version 以确认安装成功。
安装 AWS CLI
在终端中运行 aws configure 配置 AWS CLI。系统将提示您输入访问密钥 ID、秘密访问密钥、默认区域和默认输出格式。Terraform 应能自动访问这些配置。
创建一个新目录和您的第一个配置文件。我们将其命名为 main.tf,并告诉 Terraform 我们要创建一个 AWS EC2 实例。使用 HCL 编写的代码如下:
provider "aws" {
region = "us-west-2"
}
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}技术支持
初始化项目
现在,通过运行以下命令来初始化 Terraform 项目:
$ terraform init技术支持
该命令仅需运行一次,会下载所需的提供商插件。后续变更无需再次运行。
Plan
接下来我们要生成执行计划。请记住,计划会突出 Terraform 为达到目标状态所需进行的更改(在此示例中为一个正在运行的 EC2 实例)。运行:
$ terraform plan技术支持
您应当会看到类似如下的输出:
Terraform will perform the following actions:
# aws_instance.example will be created
+ resource "aws_instance" "example" {
+ ami = "ami-0c55b159cbfafe1f0"
+ instance_type = "t2.micro"
...
}
Plan: 1 to add, 0 to change, 0 to destroy.技术支持
Apply
我们已经审查了计划,现在决定执行它并交付资源。在终端中运行:
$ terraform apply技术支持
系统会要求您确认操作。输入“yes”以继续。
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes 技术支持
随后您应当会看到如下输出:
aws_instance.example: Creating...
aws_instance.example: Still creating... [10s elapsed] aws_instance.example:
Creation complete after 15s [id=i-0abcdef1234567890]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.技术支持
恭喜,您已使用 Terraform 在 AWS 上交付了第一个 EC2 实例!
我们之前提到,使用 Terraform 带来诸多好处,例如一致性与可重复性,以及通过执行计划降低人为错误率。
其他优势包括:
快速交付: Terraform 可以并行创建和更新资源,这对于快速搭建开发、测试和预发布环境尤为有用。
提升协作: 与 Git 等版本控制系统配合使用,Terraform 能大幅提升基础设施管理的协作与透明度。变更可以像应用代码一样被审查、批准和追踪。
高效灾难恢复: 如果出现问题,Terraform 可以使用同一套配置文件,从零开始快速重建整套基础设施。
社区支持: Terraform 倡导使用模块(module),即可复用的配置,能够在基础设施管理中推广最佳实践。Terraform 还拥有活跃的社区与庞大的提供商和模块生态,这意味着无论您的技术栈多么小众,通常都能找到合适的支持。
无论您是构建数据管道的数据工程师,还是希望将解决方案部署到生产环境 的数据科学家,Terraform 都是满足基础设施管理需求的优秀工具。以下是一些常见用例:
多云管理
跨多个云提供商管理基础设施并不容易。Terraform 允许您用一套工具做到这一点。此外,Terraform 还能管理本地资源,非常适合在混合环境中运营的组织。
CI/CD 工作流
Terraform 能很好地融入 CI/CD 工作流,这意味着您可以将基础设施的部署纳入软件交付流程。您也可以按需自动创建和销毁预览、开发、测试或预发布环境。
Kubernetes 集群
Terraform 可以管理不同云提供商上的 Kubernetes 集群,如 AWS(EKS)、Azure(AKS)或 GCP (GKE)。这包括搭建所需的底层基础设施、管理集群内的 Kubernetes 资源,以及根据负载需求扩缩集群。
其他流行的 IaC 工具包括 Ansible、Chef、Puppet 和 AWS CloudFormation。每种工具都有各自的长处与短板。请看下表:
Feature Terraform Ansible Chef Puppet CloudFormation Open Source Yes Yes Yes Yes No Declarative Syntax Yes No No Yes Yes Multi-Cloud Support Yes Yes Yes Yes No, AWS only State Management Yes No No Yes Yes Execution Plans Yes No No No No Dependency Management Yes Limited Limited Yes Yes
正如我们所见,尽管这些工具各有强大之处,但 Terraform 以其全面的功能集脱颖而出。当然,这份清单并不详尽,而且每种工具会根据需求服务于略有不同的用例。例如,Ansible 的过程式特性非常适合配置管理与临时性任务。
结语
在过去 10 年里,Terraform 帮助成千上万家组织管理其 IT 基础设施。凭借其声明式方法、自动化能力以及对多云环境的支持,Terraform 已成为最受欢迎的 IaC 工具之一。随着云的持续普及,它无疑将继续在基础设施管理领域扮演重要角色。
现在,您已经了解了 Terraform 的基础知识,可以进一步探索更高级的配置和真实场景。前往 HashiCorp Terraform 教程 ,学习如何用 Terraform 完成常见任务与用例,或查阅我们的博文 2024 年 14 款必备数据工程工具 ,了解 Terraform 在数据工程师工具箱中的定位。
基础设施即代码(Infrastructure as Code,IaC)是一种通过代码来自动化配置与管理基础设施的方式。虽然可以通过物理硬件配置和交互式配置工具来交付基础设施,但 IaC 具备诸多优势,例如版本控制、可重复性和可扩展性。在众多 IaC 工具中,Terraform 是其中的佼佼者。它由 HashiCorp 于 2014 年推出,现已被全球超过 50 万家组织使用。下面我们来深入了解 Terraform 的工作原理,以及如何将其用于现代 IT 运维。
在开始学习 Terraform 之前,需要说明的是:至少熟悉一家主流云服务提供商(AWS、Azure、Google Cloud 等)是前提条件,因为 Terraform 用于管理云基础设施。如果您是云计算新手,可以先学习我们的 Understanding Cloud Computing 课程打下坚实基础。
什么是 Terraform?
Terraform 是一款开源工具,允许您使用高级配置语言来定义基础设施组件及其关系。
在 Terraform 具备可读性的配置文件中,您可以声明基础设施的目标状态,Terraform 会自动计算如何到达该状态。这些文件可以进行版本管理、共享与复用,从而以一致的方式管理您的基础设施,从计算与存储资源到 DNS 和 SaaS 功能。
Terraform 可用于多种云提供商、多云架构以及本地环境。
Terraform 的关键特性
让我们更近一步,了解使 Terraform 脱颖而出的核心要点:
HashiCorp 配置语言
Terraform 使用一种名为 HashiCorp 配置语言(HCL)的高级语言,专为定义基础设施即代码而设计。高级配置语言采用声明式语法,相较于底层脚本与手动配置,更抽象也更易用。您可能已经在 YAML 或 JSON 文件中接触过类似的高级语言。
HCL 采用块结构,每个嵌套块代表资源及其配置。资源会以名称和属性显式定义。
执行计划
在定义好基础设施的目标状态后,Terraform 会生成一份执行计划。该计划会列出 Terraform 为达成该状态所需采取的步骤,便于您在应用之前审查变更。应用前检查计划可以避免不必要的修改,例如误删资源。
状态管理
Terraform 维护一个状态文件,用于自动跟踪您当前的基础设施状态,并在决定需要进行哪些变更时作为权威依据。默认情况下,该文件本地存储,名称为 terraform.tfstate。
提供商
提供商是与云平台及其他服务的 API 交互的插件,允许 Terraform 管理各类资源。官方提供商由 HashiCorp 及其可信合作伙伴(如 AWS、Azure、Google Cloud、Github、Datadog 等)开发和维护。社区也有大量插件,可在 Terraform Registry 或 Github 上找到。
资源图
Terraform 会构建一张资源图,展示基础设施中的资源及其之间的关系。该图帮助 Terraform 有效生成计划、处理资源之间的依赖关系,并确保以正确的顺序创建、更新和删除资源。这张图也有助于可视化您的基础设施,并理解您计划改动所带来的影响。
示例资源图。来源:HashiCorp 文档
Terraform 入门
让我们一起走完第一个 Terraform 工作流。如果您对 DevOps 或云计算尚不熟悉,建议先学习我们的 Understanding Cloud Computing 和 Introduction to DevOps 课程,再继续往下。
安装与设置
在本教程中,我们将于 AWS 上创建资源。如果您想跟着操作但尚无账户,请前往 AWS 注册。
第一个 Terraform 配置
创建一个新目录和您的第一个配置文件。我们将其命名为 main.tf,并告诉 Terraform 我们要创建一个 AWS EC2 实例。使用 HCL 编写的代码如下:
初始化项目
现在,通过运行以下命令来初始化 Terraform 项目:
该命令仅需运行一次,会下载所需的提供商插件。后续变更无需再次运行。
Plan
接下来我们要生成执行计划。请记住,计划会突出 Terraform 为达到目标状态所需进行的更改(在此示例中为一个正在运行的 EC2 实例)。运行:
您应当会看到类似如下的输出:
Apply
我们已经审查了计划,现在决定执行它并交付资源。在终端中运行:
系统会要求您确认操作。输入“yes”以继续。
随后您应当会看到如下输出:
恭喜,您已使用 Terraform 在 AWS 上交付了第一个 EC2 实例!
使用 Terraform 的优势
我们之前提到,使用 Terraform 带来诸多好处,例如一致性与可重复性,以及通过执行计划降低人为错误率。
其他优势包括:
Terraform 的常见用例
无论您是构建数据管道的数据工程师,还是希望将解决方案部署到生产环境的数据科学家,Terraform 都是满足基础设施管理需求的优秀工具。以下是一些常见用例:
多云管理
跨多个云提供商管理基础设施并不容易。Terraform 允许您用一套工具做到这一点。此外,Terraform 还能管理本地资源,非常适合在混合环境中运营的组织。
CI/CD 工作流
Terraform 能很好地融入 CI/CD 工作流,这意味着您可以将基础设施的部署纳入软件交付流程。您也可以按需自动创建和销毁预览、开发、测试或预发布环境。
Kubernetes 集群
Terraform 可以管理不同云提供商上的 Kubernetes 集群,如 AWS(EKS)、Azure(AKS)或 GCP(GKE)。这包括搭建所需的底层基础设施、管理集群内的 Kubernetes 资源,以及根据负载需求扩缩集群。
Terraform 与其他 IaC 工具对比
其他流行的 IaC 工具包括 Ansible、Chef、Puppet 和 AWS CloudFormation。每种工具都有各自的长处与短板。请看下表:
正如我们所见,尽管这些工具各有强大之处,但 Terraform 以其全面的功能集脱颖而出。当然,这份清单并不详尽,而且每种工具会根据需求服务于略有不同的用例。例如,Ansible 的过程式特性非常适合配置管理与临时性任务。
结语
在过去 10 年里,Terraform 帮助成千上万家组织管理其 IT 基础设施。凭借其声明式方法、自动化能力以及对多云环境的支持,Terraform 已成为最受欢迎的 IaC 工具之一。随着云的持续普及,它无疑将继续在基础设施管理领域扮演重要角色。
现在,您已经了解了 Terraform 的基础知识,可以进一步探索更高级的配置和真实场景。前往 HashiCorp Terraform 教程,学习如何用 Terraform 完成常见任务与用例,或查阅我们的博文 2024 年 14 款必备数据工程工具,了解 Terraform 在数据工程师工具箱中的定位。