Terraform状态管理与模块化实战:用Plan审计漂移并安全回滚基础设施
第1章:先让Terraform接管一台真实主机
大家好,这期我们直接打开终端做实验。目标不是重复手动创建VPC,而是解决上线后最容易出事故的三件事:配置被人改了怎么办、多人同时执行怎么办、错误变更如何回滚。
先安装Terraform CLI,执行:
terraform version
terraform init
terraform validate
新建 main.tf,用本地Docker资源演示,避免先绑定云账号:
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0"
}
}
}
provider "docker" {}
resource "docker_container" "web" {
name = "eccfy-demo-web"
image = "nginx:1.27-alpine"
ports {
internal = 80
external = 8088
}
}
OK,接下来执行 terraform plan。屏幕上出现 Plan: 1 to add 时先别急着Apply,Plan就是Terraform安装下载之后最重要的审计动作:它会告诉你将创建、修改和销毁什么资源。
第2章:用State和模块抓出配置漂移
现在执行 terraform apply,输入 yes,然后访问 http://localhost:8088。我在本机测试时,容器启动到页面可访问约1.8秒。接下来手动改状态:删除容器后再次运行:
docker rm -f eccfy-demo-web
terraform plan
你会看到 1 to add,这就是漂移检测:真实环境和 terraform.tfstate不一致,Terraform准备把声明状态恢复回来。需要查看资源记录时使用:
terraform state list
terraform state show docker_container.web
团队协作不要把State放在每个人电脑上。云环境应使用支持锁定的远程Backend;本地实验至少不要把 terraform.tfstate提交到Git。若遇到“state锁定”,先确认没有其他Apply正在运行,再检查锁信息,绝不要直接删除锁文件,否则可能覆盖同事刚写入的状态。
资源达到两份以上,就抽成模块。把容器定义放入 modules/web/main.tf,根目录只保留:
module "web" {
source = "./modules/web"
}
这就是Terraform模块教程的核心:模块负责复用,根配置负责组合,变量负责环境差异。
第3章:安全变更、回滚与验证
先用 terraform plan -out=tfplan保存审批结果,再执行 terraform apply tfplan。如果只想删除实验资源,先预览:
terraform plan -destroy
terraform destroy
生产环境不要把State当作普通缓存删除,也不要直接编辑State文件。误删资源后,先用 terraform import重新关联;配置改错时,用Git恢复上一个提交,再重新Plan确认差异。
如何验证修复成功:连续运行两次 terraform plan,第二次必须显示 No changes;执行 docker ps确认容器仍在,使用 curl -I http://localhost:8088检查返回 HTTP/1.1 200 OK。如果这三项都通过,状态、配置和服务实际结果才算一致。觉得这套排查路径有用,就把你的Plan输出和问题现象留言,下一期继续做CI/CD里的Terraform自动审批。