深色模式
Terraform 状态与变量:tfstate 与 var 管理
摘要:Terraform 靠 state 记住「现实长什么样」,state 丢了就等于失忆。本文讲远程后端与锁、变量的三种传入方式、敏感值处理与常用 state 命令。
适用环境
- 已安装 Terraform 并有一个可跑的项目目录
- 一个对象存储(S3 / OSS / COS / MinIO)用于存放远程 state
- 团队协作场景(单人练习可先跳过远程后端)
操作步骤
1. 配置远程后端与锁
本地 terraform.tfstate 有三个致命问题:别人拿不到、误删即失忆、两人同时 apply 会互相覆盖。
bash
cat > backend.tf <<'EOF'
terraform {
backend "s3" {
bucket = "my-tfstate-bucket"
key = "prod/network/terraform.tfstate"
region = "ap-northeast-1"
encrypt = true
dynamodb_table = "tf-lock" # state 锁,防并发
}
}
EOF
terraform init # 加/改 backend 后必须重新 init1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
其它后端:backend "oss"(阿里云)、backend "cos"(腾讯云)、backend "gcs"(GCP)。
2. 变量定义与传入
hcl
variable "env" { type = string, default = "dev" }
variable "node_count" { type = number, default = 2 }
variable "db_password" { type = string, sensitive = true }1
2
3
2
3
bash
cat > terraform.tfvars <<'EOF'
env = "prod"
node_count = 3
EOF
terraform plan -var-file="prod.tfvars" # 指定文件
terraform plan -var="node_count=5" # 命令行(优先级最高)
export TF_VAR_node_count=5 # 环境变量1
2
3
4
5
6
7
2
3
4
5
6
7
3. 敏感输出与 state 命令
hcl
output "db_password" { value = var.db_password, sensitive = true }1
bash
terraform output # 敏感项显示 (sensitive value)
terraform state list
terraform state show aws_instance.demo
terraform import aws_instance.demo i-0123456 # 已有资源纳入管理
terraform state pull > backup.tfstate # 备份1
2
3
4
5
2
3
4
5
4. Git 忽略清单
bash
cat > .gitignore <<'EOF'
.terraform/
*.tfstate
*.tfstate.*
crash.log
*.tfvars
EOF1
2
3
4
5
6
7
2
3
4
5
6
7
危险
terraform state rm 与 import 会直接改写 state。执行前先 terraform state pull > backup.tfstate。
验证
bash
terraform validate && terraform plan
terraform state pull | head -5 # 返回 JSON 说明后端已生效1
2
2
- [ ]
terraform.tfstate不在 Git 中,远程后端能 pull 到内容 - [ ] 第二个终端执行 apply 时被锁挡住
- [ ] 敏感变量在 plan 输出中不可见
常见坑
改了 backend 没重新 init
会报 Backend configuration changed。执行 terraform init -reconfigure。
锁没释放导致团队卡死
确认无人执行后再 terraform force-unlock <LOCK_ID>,不要一上来就强解。
.tfvars 提交进了 Git
含密码的 tfvars 一旦入库,删文件也没用(历史里还在)。用 -var-file 指向仓库外文件。