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 的核心价值可归纳为以下五个维度:

  1. 声明式配置:用户描述“最终状态”,Terraform 自动计算执行计划并完成变更,无需编写过程式脚本。
  2. 多云编排:同一套 HCL 语法管理 AWS、Azure、GCP、Kubernetes 等 3000+ Provider,消除平台锁定。
  3. 状态驱动:通过状态文件(terraform.tfstate)跟踪真实资源,实现增量变更、依赖解析与漂移检测。
  4. 模块化与复用:支持嵌套模块、版本约束、输入输出变量,团队可构建标准化组件库。
  5. 执行计划预览: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 仓库
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform
macOS Homebrew
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
Windows Chocolatey
choco install terraform
通用(手动) 下载二进制
# 从 releases.hashicorp.com 下载对应平台压缩包
curl -O https://releases.hashicorp.com/terraform/1.9.0/terraform_1.9.0_linux_amd64.zip
unzip terraform_1.9.0_linux_amd64.zip
sudo mv terraform /usr/local/bin/

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 从编写配置到资源交付的完整生命周期:

Terraform 核心工作流 1. 编写配置 main.tf / variables.tf 2. terraform init 下载 Provider / 模块 3. terraform plan 预览变更清单 4. terraform apply 执行变更 / 创建资源 5. 状态管理 terraform.tfstate 迭代变更 💡 核心闭环:编写配置 → 初始化 → 计划预览 → 应用变更 → 状态持久化 → 下次变更基于最新状态重新计划。 状态文件是 Terraform 的“唯一真相源”,必须妥善管理(远程后端 + 锁定)。

1.6 本章小结

  • Terraform 从 2014 年发展至今,已成为多云 IaC 的事实标准,其模块化 Registry 生态和声明式 HCL 语言是核心优势。
  • 相比 Ansible、CloudFormation、Pulumi,Terraform 在状态管理、多云支持和模块复用方面表现突出。
  • 安装过程简单,通过包管理器或二进制下载即可完成;terraform init 是每个项目的起点,负责 Provider 和模块的初始化。
  • 核心工作流(Write → Init → Plan → Apply → State)构成了 Terraform 的闭环操作模型,理解这一流程是后续深入学习的基础。