Terraform 基础设施即代码实战
作者:运维派 | 2026-05-23
从安装到生产级项目结构,覆盖 Terraform 核心概念和实战模式。
一、安装与配置
macOS
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
Ubuntu/Debian
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /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
验证
terraform version # Terraform v1.6.0+
二、核心概念
Provider(提供商)
声明要操作的基础设施平台。Terraform 本身不管理资源,Provider 才是执行者。
# AWS Provider
provider "aws" {
region = "us-east-1"
}
# 阿里云 Provider
provider "alicloud" {
region = "cn-hangzhou"
}
Resource(资源)
Terraform 管理的核心对象——VPC、ECS、安全组、域名记录等。
resource "alicloud_vpc" "main" {
vpc_name = "prod-vpc"
cidr_block = "10.0.0.0/16"
}
Data Source(数据源)
读取已存在的基础设施信息,不创建新资源。常用场景:读取可用区、AMI 镜像 ID。
data "alicloud_zones" "default" {
available_resource_creation = "VSwitch"
}
Variable(变量)
参数化配置,提升可复用性。
variable "instance_type" {
description = "ECS 实例规格"
type = string
default = "ecs.g7.large"
}
Output(输出)
暴露执行结果——如 ECS 公网 IP、RDS 连接地址。
output "ecs_public_ip" {
value = alicloud_instance.web.public_ip
}
State(状态文件)
terraform.tfstate 记录 Terraform 管理的资源与真实基础设施的映射。State 是整个 Terraform 最需要谨慎处理的部分。
- 本地 state → 仅适合个人学习
- 远程 backend → 生产必需(S3 + DynamoDB 锁)
三、实战:阿里云 VPC + ECS
项目结构
terraform-aliyun/
├── main.tf # Provider + 核心资源
├── variables.tf # 变量定义
├── outputs.tf # 输出
├── vpc.tf # VPC + 子网 + IGW + 路由表
├── security.tf # 安全组
└── ecs.tf # ECS 实例
完整链路
1. 变量定义 → variables.tf
variable "region" { default = "cn-hangzhou" }
variable "vpc_cidr" { default = "10.0.0.0/16" }
variable "instance_type" { default = "ecs.g7.large" }
variable "image_id" { default = "ubuntu_22_04_x64_20G_alibase_20230208.vhd" }
2. VPC + 子网 → vpc.tf
resource "alicloud_vpc" "main" {
vpc_name = "prod-vpc"
cidr_block = var.vpc_cidr
}
resource "alicloud_vswitch" "public" {
vpc_id = alicloud_vpc.main.id
cidr_block = "10.0.1.0/24"
zone_id = data.alicloud_zones.default.zones[0].id
}
3. 安全组 → security.tf
resource "alicloud_security_group" "web" {
name = "web-sg"
vpc_id = alicloud_vpc.main.id
}
resource "alicloud_security_group_rule" "allow_ssh" {
type = "ingress"
ip_protocol = "tcp"
port_range = "22/22"
security_group_id = alicloud_security_group.web.id
cidr_ip = "0.0.0.0/0"
}
4. ECS 实例 → ecs.tf
resource "alicloud_instance" "web" {
instance_name = "web-server"
instance_type = var.instance_type
image_id = var.image_id
vswitch_id = alicloud_vswitch.public.id
security_groups = [alicloud_security_group.web.id]
}
四、Terraform 工作流
terraform init # 初始化:下载 provider,配置 backend
terraform plan # 预览变更(不改任何东西)
terraform apply # 执行变更(自动执行 plan → 确认 → 执行)
terraform destroy # 销毁所有资源
关键命令:
terraform fmt # 格式化代码
terraform validate # 验证语法
terraform state list # 列出 state 中所有资源
terraform import # 将已有资源导入 state 管理
terraform refresh # 刷新 state 与真实基础设施同步
五、生产级最佳实践
1. Remote State(远程状态)
生产禁止本地 state。使用 S3 + DynamoDB 实现锁定:
terraform {
backend "s3" {
bucket = "terraform-state-prod"
key = "vpc/terraform.tfstate"
region = "us-east-1"
dynamodb_table = "terraform-locks"
}
}
2. Module(模块化)
可复用的基础设施组件。
module "vpc" {
source = "./modules/vpc"
cidr_block = "10.0.0.0/16"
name = "prod"
}
3. Workspace(工作空间)
隔离环境(dev / staging / prod)。
terraform workspace new dev
terraform workspace new staging
terraform workspace new prod
terraform workspace select prod
4. CI/CD 集成
典型 pipeline:Git Push → terraform plan → Code Review → Merge → terraform apply
5. 安全红线
.tfstate文件永远不能进 Git(含敏感信息)- Provider 凭证用环境变量,不硬编码:
export ALICLOUD_ACCESS_KEY="..." terraform apply前必须先terraform plan并 review
六、常用 Provider 速查
| Provider | 用途 | Registry 名 |
|---|---|---|
| AWS | 云基础设施 | hashicorp/aws |
| 阿里云 | 云基础设施 | aliyun/alicloud |
| Kubernetes | K8s 资源管理 | hashicorp/kubernetes |
| Helm | Helm Chart 部署 | hashicorp/helm |
| GitHub | 仓库/团队管理 | integrations/github |
| Cloudflare | DNS/CDN | cloudflare/cloudflare |
关联页面
| 页面 | 关联点 |
|---|---|
| devops-interview-guide | DevOps 面试指南(含 Terraform 相关考题) |
| ops-automation-scripts | 运维自动化脚本(与 IaC 互补的运维自动化手段) |
| jenkins-multi-master-k8s-deployment | Jenkins on K8s(CI/CD pipeline 中 Terraform 的典型位置) |