1. Terraform 入门:发展史、核心价值、与传统 IaC 工具对比、安装与初始化
1.1 Terraform 发展史
Terraform 由 HashiCorp 公司创始人 Mitchell Hashimoto 于 2014 年创建,旨在解决多云环境下基础设施编排的碎片化问题。其发展历程可概括为四个关键阶段:
| 阶段 | 时间 | 里程碑 |
|---|---|---|
| 诞生期 | 2014 | HashiCorp 发布 Terraform v0.1,仅支持 AWS、GCP 等少数 Provider |
| 成长期 | 2015–2018 | 引入 HCL 语言、状态管理、模块化支持,社区 Provider 突破 100 个 |
| 成熟期 | 2019–2022 | v0.12 大幅改进 HCL 语法;v1.0 正式发布,承诺向后兼容;Terraform Cloud 企业版普及 |
| 生态扩展期 | 2023–至今 | CDKTF(Cloud Development Kit for Terraform)成熟;Provider 生态超 3000 个;HCP Terraform 成为多云编排标准 |
关键洞察:Terraform 从单一云 Provider 起步,凭借“声明式配置 + 状态驱动”的设计哲学,迅速成为 IaC 领域的事实标准。其模块化 Registry 生态是推动企业级采纳的核心动力。
1.2 核心价值
Terraform 的核心价值可归纳为以下五个维度:
- 声明式配置:用户描述“最终状态”,Terraform 自动计算执行计划并完成变更,无需编写过程式脚本。
- 多云编排:同一套 HCL 语法管理 AWS、Azure、GCP、Kubernetes 等 3000+ Provider,消除平台锁定。
- 状态驱动:通过状态文件(terraform.tfstate)跟踪真实资源,实现增量变更、依赖解析与漂移检测。
- 模块化与复用:支持嵌套模块、版本约束、输入输出变量,团队可构建标准化组件库。
- 执行计划预览:
terraform plan输出详细的增删改清单,变更前即可评估影响范围。
一句话总结:Terraform 将基础设施视为可版本化、可审计、可复用的代码资产,从根本上改变了云资源交付方式。
1.3 与传统 IaC 工具对比
| 对比维度 | Terraform | Ansible | CloudFormation | Pulumi |
|---|---|---|---|---|
| 配置范式 | 声明式(HCL) | 过程式(YAML/Python) | 声明式(JSON/YAML) | 声明式(通用编程语言) |
| 多云支持 | 原生(3000+ Provider) | 模块扩展 | 仅 AWS | 原生(多语言 SDK) |
| 状态管理 | 内置(本地/远程) | 无状态(每次幂等执行) | 内置(Stack 驱动) | 内置(状态存储) |
| 执行模型 | Plan → Apply | Push/Pull | Change Set → Execute | Preview → Up |
| 模块复用 | Registry + Git + 版本约束 | Role/Playbook 复用 | 嵌套 Stack | 包管理器 + 版本控制 |
| 学习曲线 | 中等(HCL 语法简洁) | 低(YAML 易读) | 高(JSON 冗长) | 中高(需编程语言基础) |
选型建议:若团队已深度绑定 AWS 且无多云需求,CloudFormation 可减少额外工具链;若追求配置即代码的灵活性与多云一致性,Terraform 是当前最成熟的选择。
1.4 安装与初始化
1.4.1 安装 Terraform
Terraform 以单一二进制文件分发,支持主流操作系统。以下为 Linux/macOS/Windows 的安装方式:
| 操作系统 | 安装方式 | 命令/步骤 |
|---|---|---|
| Linux (Ubuntu/Debian) | apt 仓库 |
|
| macOS | Homebrew | |
| Windows | Chocolatey | |
| 通用(手动) | 下载二进制 |
|
1.4.2 验证安装
terraform version
# 输出示例:Terraform v1.9.0 on linux_amd64
1.4.3 初始化工作目录
初始化是使用 Terraform 的第一步,它完成 Provider 插件下载、后端配置、模块加载等准备工作。
# 创建项目目录
mkdir terraform-demo && cd terraform-demo
# 创建 main.tf 文件(示例:部署 AWS EC2 实例)
cat <<EOF > main.tf
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "TerraformDemo"
}
}
EOF
# 执行初始化
terraform init
terraform init 执行后,目录结构变为:
terraform-demo/
├── .terraform/ # Provider 插件缓存与模块元数据
│ └── providers/
│ └── registry.terraform.io/
│ └── hashicorp/
│ └── aws/
│ └── 5.0.0/
│ └── linux_amd64/
│ └── terraform-provider-aws
├── .terraform.lock.hcl # Provider 版本锁定文件
├── main.tf # 主配置文件
└── terraform.tfstate # 状态文件(初始化后暂未生成)
初始化最佳实践:
- 始终在项目根目录执行
terraform init,不要在子目录重复初始化。 - 将
.terraform.lock.hcl纳入版本控制,确保团队使用一致的 Provider 版本。 - 将
.terraform/目录加入.gitignore,避免提交二进制插件。 - 使用远程后端(如 S3 + DynamoDB)时,初始化前需确保后端存储已存在。
1.5 Terraform 核心工作流
下图展示了 Terraform 从编写配置到资源交付的完整生命周期:
1.6 本章小结
- Terraform 从 2014 年发展至今,已成为多云 IaC 的事实标准,其模块化 Registry 生态和声明式 HCL 语言是核心优势。
- 相比 Ansible、CloudFormation、Pulumi,Terraform 在状态管理、多云支持和模块复用方面表现突出。
- 安装过程简单,通过包管理器或二进制下载即可完成;
terraform init是每个项目的起点,负责 Provider 和模块的初始化。 - 核心工作流(Write → Init → Plan → Apply → State)构成了 Terraform 的闭环操作模型,理解这一流程是后续深入学习的基础。