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