plan 与 apply
执行计划、审批、destroy 风险。
plan 与 apply
这一课你将能做到
- 看懂 plan 输出中的
+、-、~、-/+和资源数量汇总 - 用
-out保存计划、用show审查、把计划原样 apply,杜绝「计划和执行不一致」 - 说出 apply 的执行顺序逻辑,并用 target、replace 处理日常特殊场景
为什么要学
plan 是 Terraform 最有价值的设计:在动任何真实资源之前,先给你一份「变更说明书」。线上事故里,有相当一部分不是 Terraform 本身的问题,而是人没认真看计划:plan 里明明写着要销毁数据库,有人一路回车。学会读 plan、保存 plan、按计划执行,是区分「会用 Terraform」和「敢在生产敲 apply」的分水岭。
人话:plan 像手术前的知情同意书——医生告诉你切哪、缝哪、风险是什么;你不看就签字,出了事不能怪手术刀。
先建立图像
plan 中四种标记:
+ create 新建资源
~ update 原地修改部分属性
- destroy 删除资源
-/+ replace 删除后重建(或先建后删,取决于参数)
一次变更的汇总行示例:
Plan: 2 to add, 1 to change, 1 to destroy.
执行顺序不是文件顺序,而是 Terraform 根据引用关系画出的依赖图:被依赖的先建(VPC → 子网 → EC2),删除时反过来。
跟着做
步骤 1:准备可反复演练的配置
新建 plan-demo/main.tf:
terraform {
required_version = ">= 1.7.0"
}
variable "instance_count" {
type = number
default = 1
}
resource "null_resource" "app" {
count = var.instance_count
triggers = {
index = count.index
role = "springboot-app"
}
}
执行 terraform init。
步骤 2:第一次 plan
terraform plan
输出片段:
Terraform used the selected providers to generate the following execution plan.
...
# null_resource.app[0] will be created
+ resource "null_resource" "app" {
+ id = (known after apply)
+ triggers = {
+ index = 0
+ role = "springboot-app"
}
}
Plan: 1 to add, 0 to change, 0 to destroy.
(known after apply) 表示这个值要等云端创建后才知道,比如 IP、ID。
步骤 3:保存计划并审查
terraform plan -out=tfplan
terraform show tfplan
-out 把计划写成二进制文件,里面锁定了当时的配置、状态和参数。之后 apply 这个文件,执行的内容和你看到的完全一致,不会被中途的代码改动影响。CI/CD 的标准姿势就是「一个 job 生成 plan 供评审,下一个 job apply 该文件」。
步骤 4:按计划执行
terraform apply tfplan
注意:apply 一个保存好的计划文件时(审批在 plan 环节已经完成)。直接 不带参数则会现场重新算一次计划并要求确认——这存在「显示的计划」和「执行的计划」之间配置被改动的风险。