三个核心概念

概念 含义
Provider 与某种平台对话的"插件"(aws、azure、gcp、kubernetes、cloudflare …)
Resource 一个具体实体(一台 VM、一条 DNS 记录、一个 IAM 角色)
State Terraform 记下"我已经建了什么"的本地账本

最简流程

main.tf:

terraform {
  required_providers {
    aws = { source = "hashicorp/aws", version = "~> 5.0" }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_s3_bucket" "logs" {
  bucket = "wadely-prod-logs"
}

四条命令:

terraform init       # 装 provider
terraform plan       # 看会改什么(不动手)
terraform apply      # 真的执行
terraform destroy    # 全删(小心)

State 是核心

terraform.tfstate 文件记录"现在云上长啥样"。它的角色:

  • 真相:apply 时对比 state vs 代码 → 算出 diff
  • 状态机:很多 resource 之间互相依赖,state 帮 Terraform 排序
  • 敏感:可能含密码 / 私钥 → 不能 commit 到 git

单机用没问题——但团队不行

两个人同时 apply:

A 跑 plan:state 显示 1 台机器
A 跑 apply:建第 2 台
B 跑 plan:state 还是 1 台(A 还没结束)
B 跑 apply:又建一台 → 重复!

解决:远程 state + locking

远程 state 标准方案(AWS)

terraform {
  backend "s3" {
    bucket         = "wadely-tf-state"
    key            = "prod/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "wadely-tf-locks"   # 旧方案:DynamoDB 加锁
    encrypt        = true
  }
}
  • S3 存 state(开版本控制 + 加密)
  • DynamoDB 提供 lock(同一时间只一个人能 apply)

Terraform 1.10+ 起 S3 backend 支持原生加锁use_lockfile = true),不再需要单独的 DynamoDB 表。OpenTofu 也已对齐。新项目直接用原生锁;老项目 DynamoDB 方案仍有效,迁移看官方文档。

GCP 用 GCS(自带对象锁);Azure 用 Storage Account;自建可用 PostgreSQL / Consul backend。

模块化:复用单元

modules/vpc/main.tf 写好一套 VPC 模板,多环境复用:

module "vpc_prod" {
  source = "./modules/vpc"
  name   = "prod"
  cidr   = "10.0.0.0/16"
}

module "vpc_staging" {
  source = "./modules/vpc"
  name   = "staging"
  cidr   = "10.1.0.0/16"
}

公司里通常有内部模块库——团队约定怎么建标准 VPC、标准 RDS。

多环境:workspace 还是目录

两种做法(社区争论了好多年):

做法 优点 缺点
workspace(一个目录多 state) 简单 各环境差异大时配置乱
目录分隔(envs/dev、envs/prod) 隔离强、清晰 重复代码多,靠模块解决

经验法则:生产建议目录分隔 + 模块复用。workspace 适合"几乎一样的环境"。

drift 检测

定期跑 terraform plan——如果什么都没改但有 diff,说明有人手改了云资源。CI 里跑这个并发告警。

CI/CD 里跑 Terraform

terraform plan 在 PR 阶段跑(自动评论 diff);merge 后由人或机器人 apply

社区方案:

  • Atlantis:自托管的 PR 自动化
  • Terraform Cloud / HCP Terraform:HashiCorp 官方
  • Spacelift / Env0:商业平台

关于 OpenTofu

2023 年 Terraform 改 License 后,社区 fork 出 OpenTofu(Linux Foundation 旗下)。语法 100% 兼容,开源。新项目可以直接选它。

推荐阅读

下一篇:Ansible——Terraform 创建机器,Ansible 配置内部。