Terraform 是什么
这一课你将能做到
- 用自己的话说清楚 Terraform 解决什么问题、和手工点控制台有什么区别
- 在本机装好 Terraform 1.7+,并跑通第一条命令
terraform version - 看懂一份最简单的 Terraform 配置长什么样,知道「声明式」是什么意思
为什么要学
你的 Spring Boot 应用要上云,需要一台 EC2、一个 RDS、一个 S3 桶、一套安全组。第一次你可以在 AWS 控制台点鼠标点出来,但第二个环境(测试环境)怎么办?换区域怎么办?三个月后要扩容,谁还记得当时点了哪些选项?
Terraform 就是把「点鼠标建基础设施」这件事写成文本文件。文件可以进 Git,可以评审,可以复用,可以一键重建整套环境。行业里这叫 IaC(Infrastructure as Code,基础设施即代码),Terraform 是这个领域事实标准,运维、后端、DevOps 岗位几乎必考。
人话:手工建基础设施像在记事本里记密码,只有你自己懂、还容易忘;Terraform 像把菜谱写下来,任何人照着做,做出来的菜都一样。
先建立图像
Terraform 的核心循环只有四个动作:
写 .tf 文件 → terraform init (初始化,装插件)
→ terraform plan (预览:将创建/修改/删除什么)
→ terraform apply (执行:真正调用云 API)
→ terraform destroy(销毁:整套环境删掉)
对比两种工作方式:
| 维度 | 控制台手工操作 | Terraform |
|---|---|---|
| 操作记录 | 散落在浏览器历史和人脑里 | Git 提交历史,可追溯 |
| 新建一套同样环境 | 再点半小时,还容易漏 | 复制目录,apply |
| 谁改了什么 | 查不到 | git blame 一清二楚 |
| 灾难恢复 | 凭记忆重建 | 重新 apply |
| 多人协作 | 互相覆盖 | state 锁 + 代码评审 |
跟着做
步骤 1:安装 Terraform
Windows 推荐用 winget(PowerShell 中执行):
winget install Hashicorp.Terraform
macOS:
brew install terraform
安装后新开一个终端验证:
terraform version
看到类似 Terraform v1.7.x 即成功。本课程全部命令基于 1.7 及以上版本,1.5/1.6 的旧版本部分输出略有差异。
步骤 2:写第一份配置
新建目录 tf-demo,在里面创建 main.tf:
# 约束 Terraform 版本
terraform {
required_version = ">= 1.7.0"
}
# 用 null_resource 做演示:不需要任何云账号就能跑
resource "null_resource" "hello" {
triggers = {
message = "我的第一份 Terraform 配置"
}
}
null_resource 是一个「什么真实资源都不创建」的演示资源,适合验证工具链。注意它需要 null 插件,下一步 init 会自动下载。
步骤 3:初始化
cd tf-demo
terraform init
输出最后一行是 Terraform has been successfully initialized!。目录下会多出 .terraform 文件夹(存插件)和 .terraform.lock.hjson(依赖锁文件,要提交到 Git)。
步骤 4:预览与执行
terraform plan
plan 会显示「将要创建 1 个资源」。确认无误后:
terraform apply
Terraform 会再次显示计划并要求输入 yes,输入后执行。执行完目录里会生成 terraform.tfstate,这就是状态文件,下一课系列会专门讲。
步骤 5:销毁
terraform destroy
同样输入 yes,资源被删除。这就是「整套环境一键拆除」——用完即毁,不花一分冤枉钱,这是云上省钱的基本功。
讲清楚要点
- 声明式,不是命令式:你写的是「我要一个这样的资源」(What),不写「先点哪个按钮再点哪个」(How)。Terraform 自己计算该调用哪些 API、按什么顺序。
- 幂等:同一份配置 apply 十次和一次效果一样。资源已存在且符合描述,就什么都不做。
- Provider 插件模型:Terraform 核心不懂 AWS,它通过 provider(约两千个)对接 AWS、Azure、GCP、Kubernetes 等各种平台。
- 状态(state)是真相的账本:Terraform 用 state 文件记录「配置中的资源」和「真实世界资源」的对应关系,没有它 Terraform 不知道该管谁。
- 适用范围:不止云资源,Kubernetes 对象、DNS 记录、GitHub 仓库、监控告警,只要有 provider 就能管。
你可能会懵的地方
-
Terraform 和 Ansible 有什么区别? Terraform 管「资源的生命周期」(机器存在不存在、网络怎么连),擅长 provisioning;Ansible 更擅长把已经存在的机器配置好(装软件、改配置文件),两者经常配合使用。
-
学 Terraform 必须先有 AWS 账号吗? 不需要。前期可以用
null_resource、local_file这类本地 provider 练语法;后面 AWS 课时建议注册账号并用免费套餐(Free Tier),注意用完及时 destroy。 -
OpenTofu 是什么?要学哪个? OpenTofu 是 Terraform 1.5 的开源分叉,语法几乎完全兼容。本课程以 Terraform 1.7+ 为准,学到的 HCL 和工作流在两者间通用。
-
Terraform 免费吗? Terraform CLI 个人和企业都可免费使用;收费的是 Terraform Cloud/Enterprise 这类托管协作平台(远程 state、策略管控),小团队用 S3 自建后端即可。
-
配置文件为什么是 .tf 而不是 yaml? Terraform 用自己设计的 HCL(HashiCorp Configuration Language),下一课专门讲。它比 YAML 更适合表达资源块和表达式引用。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| 在控制台手改了 Terraform 管的资源 | 下次 apply 被改回去或状态漂移 | 所有变更只改 .tf 文件 |
| 不看 plan 直接 apply | 创建了意外资源甚至产生费用 | 每次先 plan,逐行看 +/−/~ |
把 .terraform 目录提交到 Git | 体积大、跨平台不兼容 | .gitignore 忽略它,只提交 lock 文件 |
| 一台机器多人共用本地 state | 互相覆盖、状态损坏 | 用远程 backend(第 5 课讲) |
生产环境用 apply -auto-approve | 跳过人工确认 | 生产必须人工看计划后确认 |
卡点急救
terraform命令找不到:Windows 新装后没重开终端,关掉 PowerShell 重开;仍不行检查 PATH 里有没有 Terraform 安装目录。- init 下载插件卡住:网络访问 registry.terraform.io 慢,可设置国内镜像或配置网络代理:
$env:HTTPS_PROXY="http://127.0.0.1:端口"。 - apply 后想反悔:别直接删 state 文件。先
terraform plan -destroy看销毁范围,或用terraform state rm等命令处理,第 5 课细讲。
面试常问
-
什么是 IaC?Terraform 相比直接写脚本(Shell/AWS CLI)好在哪? IaC 即用代码管理基础设施。脚本是命令式的,需要自己处理「资源已存在怎么办、删除顺序、依赖关系」;Terraform 声明目标状态,自动算差异(diff)、维护依赖图、提供统一的 plan 审批环节和状态管理,可重复、可审计。
-
Terraform 的核心工作流是什么? init 初始化并下载 provider;plan 生成执行计划供审查;apply 调用平台 API 落地变更;destroy 释放资源。配套还有 fmt、validate 做代码质量检查。
-
为什么说 Terraform 是幂等的? 它每次根据配置和 state 计算目标状态与当前状态的差异,无差异则不动作,所以重复执行结果一致。
自测三问
- 不用 Terraform,手工搭建一套环境会在哪些场景出问题?至少说出 3 个。
- init、plan、apply、destroy 各自的作用是什么?能跳过 plan 直接 apply 吗?
- state 文件为什么重要?如果两台机器各有一份本地 state 会怎样?
小结一句话
Terraform 用声明式配置把基础设施变成可版本化、可复用、可一键重建的代码,核心循环就是 init → plan → apply → destroy。
延伸
- Terraform 官方文档首页
- Install Terraform 官方安装指南
- 下一课:HCL 语法——读懂并写好每一个资源块。