返回首页

Terraform 基础设施即代码实战 — 从入门到生产

📅 创建于 2026-05-25 🔄 更新于 2026-05-25 📝 624 字

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-guideDevOps 面试指南(含 Terraform 相关考题)
ops-automation-scripts运维自动化脚本(与 IaC 互补的运维自动化手段)
jenkins-multi-master-k8s-deploymentJenkins on K8s(CI/CD pipeline 中 Terraform 的典型位置)