Terraform 简介 #
什么是基础设施即代码(IaC)? #
基础设施即代码(Infrastructure as Code,IaC)是一种通过代码来管理和配置基础设施的方法。它将基础设施的定义、配置和管理都转化为代码,使得基础设施可以像应用程序一样进行版本控制、测试和部署。
传统基础设施管理的痛点 #
text
┌─────────────────────────────────────────────────────────────┐
│ 传统基础设施管理 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 问题: │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 手动配置 │ │ 文档缺失 │ │ 环境不一致 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ ❌ 人工操作容易出错 │
│ ❌ 配置漂移难以追踪 │
│ ❌ 环境之间差异大 │
│ ❌ 无法版本控制 │
│ ❌ 难以复制和扩展 │
│ ❌ 团队协作困难 │
│ │
└─────────────────────────────────────────────────────────────┘
IaC 的解决方案 #
text
┌─────────────────────────────────────────────────────────────┐
│ 基础设施即代码 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 优势: │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 代码化管理 │ │ 版本控制 │ │ 自动化部署 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ ✅ 可重复执行,结果一致 │
│ ✅ Git 版本控制,可追溯 │
│ ✅ 环境标准化,易于复制 │
│ ✅ 代码审查,提高质量 │
│ ✅ 自动化流水线集成 │
│ ✅ 团队协作友好 │
│ │
└─────────────────────────────────────────────────────────────┘
IaC 工具分类 #
text
┌─────────────────────────────────────────────────────────────┐
│ IaC 工具分类 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 声明式(Declarative) │
│ ├── Terraform → 定义期望状态 │
│ ├── CloudFormation → AWS 原生 │
│ ├── Pulumi → 使用通用编程语言 │
│ └── ARM Templates → Azure 原生 │
│ │
│ 过程式(Imperative) │
│ ├── Ansible → 配置管理 │
│ ├── Chef → 配置管理 │
│ ├── Puppet → 配置管理 │
│ └── SaltStack → 配置管理 │
│ │
│ 容器编排 │
│ └── Kubernetes → 容器编排 │
│ │
└─────────────────────────────────────────────────────────────┘
什么是 Terraform? #
Terraform 是 HashiCorp 公司开发的开源基础设施即代码工具,使用声明式配置语言 HCL(HashiCorp Configuration Language)来定义和管理基础设施资源。它采用"基础设施即代码"的理念,让用户可以用代码来描述基础设施的期望状态。
核心定位 #
text
┌─────────────────────────────────────────────────────────────┐
│ Terraform │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 多云支持 │ │ 声明式语法 │ │ 执行计划 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 状态管理 │ │ 模块化 │ │ 生态丰富 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
Terraform 的历史 #
text
2014年 ─── Terraform 诞生
│
│ HashiCorp 发布
│ 开源基础设施即代码工具
│
2015年 ─── Terraform 0.6
│
│ 模块系统
│ 远程状态管理
│
2017年 ─── Terraform 0.10
│
│ Provider 分离
│ 更好的插件系统
│
2019年 ─── Terraform 0.12
│
│ HCL 2.0
│ 更强大的表达式
│
2021年 ─── Terraform 1.0
│
│ 稳定版本发布
│ 长期支持承诺
│
2023年 ─── Terraform 1.5+
│
│ 测试框架
│ 配置移动检测
│
至今 ─── 行业标准
│
│ 超过 3000+ Provider
│ 云厂商官方支持
Terraform 的核心特点 #
1. 多云支持 #
text
┌─────────────────────────────────────────────────────────────┐
│ 多云统一管理 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Terraform │ │
│ └───────────────────────┬─────────────────────────────┘ │
│ │ │
│ ┌────────────────────┼────────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ AWS │ │Azure │ │ GCP │ │
│ └──────┘ └──────┘ └──────┘ │
│ │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ K8s │ │VMware│ │ 更多 │ │
│ └──────┘ └──────┘ └──────┘ │
│ │
│ 统一的语法管理不同云平台资源 │
│ │
└─────────────────────────────────────────────────────────────┘
2. 声明式语法 #
hcl
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "example-instance"
}
}
text
┌─────────────────────────────────────────────────────────────┐
│ 声明式 vs 过程式 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 声明式(Terraform): │
│ "我想要一个 t2.micro 的 EC2 实例" │
│ → Terraform 自动计算如何实现 │
│ │
│ 过程式(Shell/Ansible): │
│ "检查实例是否存在" │
│ "如果不存在,创建实例" │
│ "如果存在,检查配置是否正确" │
│ "如果不正确,更新配置" │
│ │
└─────────────────────────────────────────────────────────────┘
3. 执行计划 #
text
┌─────────────────────────────────────────────────────────────┐
│ 执行计划预览 │
├─────────────────────────────────────────────────────────────┤
│ │
│ $ 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" │
│ + tags = { │
│ + "Name" = "example-instance" │
│ } │
│ } │
│ │
│ Plan: 1 to add, 0 to change, 0 to destroy. │
│ │
│ 优势: │
│ ✅ 变更前预览 │
│ ✅ 安全可控 │
│ ✅ 避免意外操作 │
│ │
└─────────────────────────────────────────────────────────────┘
4. 状态管理 #
text
┌─────────────────────────────────────────────────────────────┐
│ 状态文件 │
├─────────────────────────────────────────────────────────────┤
│ │
│ terraform.tfstate │
│ { │
│ "version": 4, │
│ "resources": [ │
│ { │
│ "type": "aws_instance", │
│ "name": "example", │
│ "instances": [{ │
│ "attributes": { │
│ "id": "i-1234567890abcdef0", │
│ "instance_type": "t2.micro" │
│ } │
│ }] │
│ } │
│ ] │
│ } │
│ │
│ 作用: │
│ ✅ 记录资源状态 │
│ ✅ 跟踪资源映射 │
│ ✅ 检测配置漂移 │
│ │
└─────────────────────────────────────────────────────────────┘
5. 模块化 #
text
┌─────────────────────────────────────────────────────────────┐
│ 模块化架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ modules/ │
│ ├── vpc/ │
│ │ ├── main.tf │
│ │ ├── variables.tf │
│ │ └── outputs.tf │
│ ├── ec2/ │
│ │ ├── main.tf │
│ │ ├── variables.tf │
│ │ └── outputs.tf │
│ └── rds/ │
│ ├── main.tf │
│ ├── variables.tf │
│ └── outputs.tf │
│ │
│ 优势: │
│ ✅ 代码复用 │
│ ✅ 封装最佳实践 │
│ ✅ 简化配置 │
│ │
└─────────────────────────────────────────────────────────────┘
Terraform 工作流程 #
核心命令 #
text
┌─────────────────────────────────────────────────────────────┐
│ Terraform 工作流 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Write │ -> │ Plan │ -> │ Apply │ │
│ │ 编写配置 │ │ 制定计划 │ │ 执行变更 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ 1. terraform init 初始化,下载 Provider │
│ 2. terraform plan 生成执行计划 │
│ 3. terraform apply 执行变更 │
│ 4. terraform destroy 销毁资源 │
│ │
└─────────────────────────────────────────────────────────────┘
详细流程 #
text
┌─────────────────────────────────────────────────────────────┐
│ 完整工作流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 编写配置 │
│ └── 创建 .tf 文件,定义基础设施 │
│ │
│ 2. 初始化 │
│ $ terraform init │
│ └── 下载 Provider 插件 │
│ └── 初始化后端配置 │
│ │
│ 3. 验证配置 │
│ $ terraform validate │
│ └── 检查语法正确性 │
│ │
│ 4. 格式化 │
│ $ terraform fmt │
│ └── 统一代码格式 │
│ │
│ 5. 制定计划 │
│ $ terraform plan │
│ └── 对比状态文件 │
│ └── 生成执行计划 │
│ │
│ 6. 执行变更 │
│ $ terraform apply │
│ └── 创建/更新/删除资源 │
│ └── 更新状态文件 │
│ │
│ 7. 销毁资源 │
│ $ terraform destroy │
│ └── 删除所有管理的资源 │
│ │
└─────────────────────────────────────────────────────────────┘
Terraform vs 其他 IaC 工具 #
Terraform vs CloudFormation #
| 特性 | Terraform | CloudFormation |
|---|---|---|
| 云支持 | 多云 | 仅 AWS |
| 语法 | HCL | YAML/JSON |
| 状态管理 | 可配置后端 | AWS 托管 |
| 模块化 | 模块系统 | 嵌套堆栈 |
| 学习曲线 | 中等 | 较低 |
| 社区 | 活跃 | AWS 生态 |
Terraform vs Pulumi #
| 特性 | Terraform | Pulumi |
|---|---|---|
| 语言 | HCL | TypeScript/Python/Go |
| 学习曲线 | 需学习 HCL | 使用熟悉语言 |
| 类型安全 | 弱类型 | 强类型 |
| 测试 | 有限支持 | 原生支持 |
| 生态 | 成熟 | 发展中 |
Terraform vs Ansible #
| 特性 | Terraform | Ansible |
|---|---|---|
| 类型 | 基础设施编排 | 配置管理 |
| 范式 | 声明式 | 过程式 |
| 状态 | 有状态 | 无状态 |
| 用途 | 创建资源 | 配置资源 |
Terraform 的应用场景 #
1. 多云架构 #
hcl
provider "aws" {
region = "us-east-1"
}
provider "azurerm" {
features {}
}
provider "google" {
region = "us-central1"
}
resource "aws_instance" "app" {
instance_type = "t2.micro"
}
resource "azurerm_virtual_machine" "app" {
vm_size = "Standard_DS1_v2"
}
resource "google_compute_instance" "app" {
machine_type = "e2-micro"
}
2. 基础设施标准化 #
text
┌─────────────────────────────────────────────────────────────┐
│ 环境标准化 │
├─────────────────────────────────────────────────────────────┤
│ │
│ environments/ │
│ ├── dev/ │
│ │ └── main.tf → 开发环境 │
│ ├── staging/ │
│ │ └── main.tf → 预发布环境 │
│ └── prod/ │
│ └── main.tf → 生产环境 │
│ │
│ 使用相同的模块,不同的变量 │
│ │
└─────────────────────────────────────────────────────────────┘
3. CI/CD 集成 #
text
┌─────────────────────────────────────────────────────────────┐
│ CI/CD 流水线 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 代码提交 │
│ │ │
│ ▼ │
│ terraform fmt -check 格式检查 │
│ │ │
│ ▼ │
│ terraform validate 语法验证 │
│ │ │
│ ▼ │
│ terraform plan 生成计划 │
│ │ │
│ ▼ │
│ 人工审批 │
│ │ │
│ ▼ │
│ terraform apply 执行变更 │
│ │
└─────────────────────────────────────────────────────────────┘
Terraform 的优势与局限 #
优势 #
text
✅ 多云支持
- 统一管理多个云平台
- 避免厂商锁定
- 灵活迁移
✅ 声明式语法
- 描述期望状态
- 自动计算差异
- 幂等操作
✅ 执行计划
- 变更前预览
- 安全可控
- 避免意外
✅ 状态管理
- 跟踪资源状态
- 检测配置漂移
- 支持团队协作
✅ 模块化
- 代码复用
- 封装最佳实践
- 简化配置
✅ 丰富生态
- 3000+ Provider
- 大量社区模块
- 活跃的社区
局限性 #
text
⚠️ 状态管理复杂性
- 需要安全存储状态文件
- 状态锁定需要配置
- 敏感信息需要加密
⚠️ 学习曲线
- 需要学习 HCL 语法
- 理解状态管理概念
- 熟悉 Provider 特性
⚠️ 调试困难
- 错误信息有时不够清晰
- 调试工具有限
- 需要经验积累
⚠️ Provider 依赖
- Provider 更新可能引入问题
- 部分 Provider 功能不全
- 需要关注版本兼容
学习路径 #
text
入门阶段
├── Terraform 简介(本文)
├── 安装与配置
├── HCL 语法基础
└── 第一个资源
进阶阶段
├── 资源管理
├── 变量与输出
├── 状态管理
└── 模块化
高级阶段
├── 高级表达式
├── 多环境管理
├── CI/CD 集成
└── 最佳实践
实战阶段
├── AWS 基础设施
├── Kubernetes 集群
└── 多云架构
下一步 #
现在你已经了解了 Terraform 的基本概念,接下来学习 安装与配置,开始实际使用 Terraform!
最后更新:2026-03-29