核对当前目录、Terraform 版本、变量文件和环境,先排除在错误项目中生成计划。
外观
外观
约 3628 字大约 12 分钟
TerraformIaCHCLplan
2026-07-30
[Windows PowerShell] wsl ~:打开本机默认的 WSL2 Ubuntu;本课只在 WSL 中执行 fmt、validate 和 plan,不需要 SSH 登录 ECS,也不执行 apply。前两次课我们先看懂了公有云资源,又讨论了生命周期与恢复。本次课开始把资源意图写成代码。代码可以复查、比较和重复使用,但也会带来新的风险:一行配置可能影响许多资源,状态文件和保存的计划还可能包含敏感数据。
关键提醒
Terraform 配置描述“想要什么”,plan 展示“准备改变什么”,state 记录“配置对应现实中的什么”。本课只到 plan,不执行 apply。
学完这一课,你可以:
init → fmt → validate → plan → review 完成一次只读执行计划。add/change/destroy 评审计划,不把“命令成功”当成“方案安全”。本课只走到 terraform plan。配置用于练习格式、校验、计划评审和敏感文件治理,不配置真实 AccessKey,也不执行 apply。
完成时要能拿出三类证据:配置通过 fmt 与 validate,计划摘要与预期一致,state、plan、.env 和私密变量没有进入提交目录。
基础设施即代码(IaC)(用可版本化的配置描述基础设施目标状态,并通过工具生成、评审和执行变更)。
Terraform 的核心代码块与分工如下:
| 代码块 | 回答的问题 | 本课示例 |
|---|---|---|
terraform 块 | 声明依赖的 Terraform 版本与 Provider | required_version |
variable 块 | 哪些参数允许跨环境灵活变动? | 环境标识、存储类型、保留天数 |
resource 块 | 最终希望在云端创建管理什么资源? | 内置 terraform_data 测试载体 |
output 块 | 执行完毕后需要暴露哪些关键信息? | 计划生成摘要 |
| state 状态文件 | 配置里的逻辑地址对应现实中的哪项资源? | 本课仅执行 plan,不产生正式 state |
观看时留意:把资源写成代码后,审查、复用和版本记录发生了什么变化?
与本课的关系:视频使用 AWS 举例,IaC 的基本思想同样适用于本课的 Terraform 计划。
本课的 main.tf 采用 Terraform 内置的 terraform_data 资源,用来承载“云存储方案模拟评审”。它不连接阿里云 API,也不会创建真实的 OSS Bucket,学生可以练习完整的 Terraform 计划流程,同时避免在本次实训中引入云凭据和资源费用。
resource "terraform_data" "course_storage_plan" {
input = {
environment = var.environment
storage_class = var.storage_class
retention_days = var.retention_days
execution_mode = "plan-only"
}
}这段 HCL 声明了一个本地计划对象。资源唯一标识是 terraform_data.course_storage_plan;input 中的 4 个字段会在 plan 阶段全部输出,方便审核环境、存储类型与保存期限。
定义变量时,建议显式提供类型约束与校验逻辑:
variable "retention_days" {
description = "拟议的备份保留天数"
type = number
default = 7
validation {
condition = var.retention_days >= 1 && var.retention_days <= 30
error_message = "课程演示的保留天数必须在 1—30 天之间。"
}
}type = number 严防非数值混入;validation 块则在最外层拦截非法入参。它能预防明显的配置差错,但业务上的最终保留期与成本预算依然需要运维人员人工把关。
实训包包含 main.tf、.gitignore、terraform.tfvars.example 和 starter/ 答题模板(从智慧职教课程资源区下载 lab-13-starter.zip 解压)。切换到 WSL:
[WSL] mkdir -p ~/cloud-course/lab-13
[WSL] cd ~/cloud-course/lab-13
[WSL] cp -r /path/to/starter/* .确认当前的工作目录。执行 pwd 预期结果末尾应包含 /cloud-course/lab-13。
[WSL] terraform version输出当前安装的 Terraform CLI 版本与系统平台。如果提示命令未找到,请暂停实训,按官方文档和课程安装说明处理,严禁使用来源不明的版本。
[WSL] terraform init -backend=false -input=false初始化工作目录。-backend=false 不配置远程状态,-input=false 禁止交互提问。本例只使用内置 Provider,因此不会索取云凭据。
[WSL] terraform fmt按 Terraform 规范格式化 .tf 文件;有改动时会显示文件名。格式化只调整代码样式,不判断云资源是否合理。
[WSL] terraform fmt -check -diff检查格式而不写入,-diff 在不合格时显示差异。命令没有输出且退出码为 0,表示格式检查通过。
[WSL] terraform validate检查配置语法和内部一致性。HashiCorp 官方文档明确说明,validate 不会验证远程服务或 Provider API;配置语法通过只是过了第一关,账号、配额、地域和资源名称是否可用还得另外确认。
2026-07-28 在云主机 B 的隔离目录中真实运行,使用的是通过官方 SHA-256 校验的 Terraform 1.15.8:
云主机 B 课程专用目录 · Terraform 1.15.8 · 2026-07-28 真实运行
root@SYG680400:/opt/xpk-course-demos/lesson-13/work$ ../bin/terraform versionTerraform v1.15.8on linux_amd64“确认 Terraform 版本”保留了完整命令和与它相邻的输出。判断时应直接引用输出中的字段或状态,不要把步骤名称当成结论。
这一步是“官方校验的 Terraform 二进制在隔离目录初始化内置 Provider,格式检查和配置校验通过,未请求云凭据”证据链中的一环。
不能证明阿里云 Provider、账号、配额或 OSS API 可用

整页截图与上方分步卡片来自同一条记录;敏感字段已经遮盖,较长命令可能经过换行排版。
[WSL] terraform plan -input=false -lock=false -out=course.tfplan -var-file=terraform.tfvars.example生成并保存执行计划。-out 把计划写入二进制文件,-var-file 读取本课非敏感示例值;-lock=false 仅用于本课没有共享远程 state 的隔离演示,真实团队环境不应随意关闭锁。
计划输出中的符号要逐项确认:
| 符号或摘要 | 含义 | 评审动作 |
|---|---|---|
+ create | 准备创建新对象 | 核对名称、地域、费用、默认访问权限 |
~ update in-place | 准备原地修改 | 核对服务影响和回退 |
-/+ replace | 先删后建或替换 | 按高风险动作评审数据与停机 |
- destroy | 准备删除 | 没有明确授权和恢复点就停止 |
(known after apply) | 只有执行后才能得到 | 不能把 unknown 编造成确定值 |
本课真实 plan 只有内置教学对象:
云主机 B 隔离目录 · 只运行 plan,未运行 apply
...$ ../bin/terraform plan -input=false -lock=false -no-color \
-out=course.tfplan -var-file=terraform.tfvars.exampleTerraform will perform the following actions: # terraform_data.course_storage_plan will be created + resource "terraform_data" "course_storage_plan" { + id = (known after apply) + input = { + environment = "dev" + execution_mode = "plan-only" + retention_days = 7 + storage_class = "Standard" } }Plan: 1 to add, 0 to change, 0 to destroy.Saved the plan to: course.tfplan[PASS] plan saved; terraform apply was not executed这是实际生成的推测性计划;terraform_data 只承载课堂评审数据,不会创建 OSS。“生成 Terraform 执行计划”保留了完整命令和与它相邻的输出。判断时应直接引用输出中的字段或状态,不要把步骤名称当成结论。
这一步是“真实生成的计划包含 terraform_data.course_storage_plan,摘要为 1 add、0 change、0 destroy,未执行 apply”证据链中的一环。
terraform_data 只承载课堂评审数据,不是 OSS 资源,也不证明真实云变更可以执行

整页截图与上方分步卡片来自同一条记录;敏感字段已经遮盖,较长命令可能经过换行排版。
观看时留意:配置、状态文件和真实云资源之间怎样对应,任何一项变化会影响什么?
与本课的关系:状态文件可能包含敏感数据,不能上传到作业、公开仓库或 AI 对话。
[WSL] terraform show -no-color course.tfplan以可读形式再次查看保存的计划。-no-color 便于放入日志或报告;不要把完整计划文件或包含敏感值的输出上传到作业平台。
从资源地址、动作和 unknown 开始,逐步检查访问、费用、状态和批准边界。
核对当前目录、Terraform 版本、变量文件和环境,先排除在错误项目中生成计划。
看到 Plan: 1 to add 还不能直接批准。继续检查:
destroy 或 replace?Terraform 使用 state 把配置中的资源地址映射到远端对象,并保存依赖和属性。默认本地文件名为 terraform.tfstate。它不是普通构建产物,也不能直接手工编辑。
安全边界
变量标记 sensitive 主要隐藏终端显示,不保证值不会进入 state 或保存的 plan。state、tfplan、含密钥的 tfvars 和后端配置都要按敏感文件管理。
本课 .gitignore 至少包含:
.terraform/
*.tfstate
*.tfstate.*
*.tfplan
*.auto.tfvars
.env.terraform/ 可能含 Provider、模块和后端配置;*.tfstate* 排除状态与备份;*.tfplan 排除保存的计划;*.auto.tfvars 和 .env 防止常见私密输入误提交。.terraform.lock.hcl 是 Provider 依赖锁文件,真实项目通常应提交,它与 state 锁不是同一个概念。
实训包中已包含 .gitignore 文件,确认它在当前目录:
[WSL] cp starter/.gitignore .gitignore 2>/dev/null || test -f .gitignore
[WSL] git init只在当前实验目录创建本地 .git/ 元数据,不会提交文件,也不会连接远程仓库。完成这一步后,git check-ignore 才有仓库上下文可以读取本课 .gitignore。
[WSL] git check-ignore -v --no-index terraform.tfstate course.tfplan secrets.auto.tfvars .env .terraform/显示每个路径匹配了 .gitignore 的哪一行。--no-index 也检查未跟踪或不存在的示例路径。
[WSL] find . -maxdepth 1 -name '*.tfstate*' -print只在当前目录查找 state 文件。本课没有执行 apply,预期没有输出;没有本地 state 不代表可以忽略远程后端治理。
云主机 B 隔离目录 · .gitignore 与源文件真实检查
...$ git check-ignore -v --no-index terraform.tfstate course.tfplan \
secrets.auto.tfvars .env .terraform/.gitignore:2:*.tfstate terraform.tfstate.gitignore:4:*.tfplan course.tfplan.gitignore:5:*.auto.tfvars secrets.auto.tfvars.gitignore:6:.env .env.gitignore:1:.terraform/ .terraform/“确认敏感文件排除规则”保留了完整命令和与它相邻的输出。判断时应直接引用输出中的字段或状态,不要把步骤名称当成结论。
这一步是“state、计划、自动变量、.env 与 .terraform 命中排除规则,未生成 state,源文件未发现常见凭据标记”证据链中的一环。
模式扫描不能证明所有秘密都不存在,也不能证明远程 backend 已加密、锁定或备份

整页截图与上方分步卡片来自同一条记录;敏感字段已经遮盖,较长命令可能经过换行排版。
团队使用远程 state 时,还要确认以下问题:
对象存储(以 Bucket、Object Key、对象数据和元数据管理非结构化数据的存储模型)。
阿里云官方文档说明 OSS 提供 RESTful API,并支持标准、低频、归档等存储类型。它适合备份包、图片、日志和静态资源,不是直接挂载给数据库的普通块设备。

观看时留意:Bucket、Object 和对象地址怎样组成最小的对象存储模型?
与本课的关系:控制台界面与费用规则可能变化,设计时仍要检查权限、流量和当前计费说明。
设计课程备份 Bucket 时,至少要明确以下内容:
| 设计项 | 要回答的问题 | 课程默认 |
|---|---|---|
| 用途 | 保存站点备份、数据库备份还是静态资源? | 站点备份 |
| 地域 | 与 ECS、合规和传输成本怎样匹配? | 按本人资源核对 |
| ACL | 谁能读取对象? | 私有 |
| 存储类型 | 访问频率和最短存储周期怎样? | 先评审 Standard |
| 版本与保留 | 误删后能否恢复,保留多久? | 写入设计,不执行 |
| 生命周期规则 | 何时转低频、归档或删除? | 不自动删除未知对象 |
| 加密 | 平台侧和客户端侧怎样保护? | 核对官方能力 |
| 费用 | 容量、请求、取回和流量怎样计费? | 以控制台与账单为准 |
在真实的阿里云 Provider 中,OSS Bucket 和 ACL 已经是独立资源。以下代码仅供阅读,不要放进本课的可执行目录:
resource "alicloud_oss_bucket" "course_backup" {
bucket = "必须全局唯一且经过批准的名称"
storage_class = "Standard"
force_destroy = false
}
resource "alicloud_oss_bucket_acl" "course_backup" {
bucket = alicloud_oss_bucket.course_backup.bucket
acl = "private"
}第一段声明 Bucket 并保持 force_destroy = false,避免删除 Bucket 时顺带删除全部对象。第二段单独设置私有 ACL。代码仍缺少 Provider、地域、凭据、版本、生命周期、加密、费用和授权,不能直接 apply。
阿里云还提供 OSS Backend 方案,把 Terraform state 存入 OSS,并可结合锁机制支持团队协作。远程保存不是“把 tfstate 随便上传到一个 Bucket”:Bucket 权限、加密、版本、锁、恢复和后端凭据都必须一起设计。
输入脱敏后的 HCL 片段、plan 摘要或 OSS 设计,让助教检查资源动作、状态治理与费用恢复边界。
本实验的原始聊天仅保存在当前标签页,不会写入全局课程助教上下文。
在 ~/cloud-course/lab-13 完成:
[WSL] mkdir -p answers创建答题目录。
[WSL] cp starter/plan-review.tsv answers/plan-review.tsv复制计划评审表,逐项填写资源地址、动作、风险、费用、验证和批准结论。
[WSL] cp starter/storage-design.tsv answers/storage-design.tsv复制云存储设计表,填写 Bucket 用途、访问、存储类型、版本、保留、加密、费用和恢复。
[WSL] bash verify.sh脚本实际运行 fmt、init、validate 和 plan,检查 1 add / 0 change / 0 destroy、敏感文件排除与两张答题表。脚本不会执行 apply,也不会连接阿里云 API。
完整步骤见实训 13:Terraform 计划评审与 OSS 设计。
[WSL] find . -maxdepth 2 -type f -print清理前列出两层内的文件,确认没有真实 .env、私密 tfvars、state 或未知 plan。
[WSL] find .terraform -maxdepth 2 -type f -print 2>/dev/null只读查看初始化目录。确认报告证据已保存后,执行清理:
[WSL] rm -rf .terraform course.tfplan不要在路径不清楚时执行递归删除——先用 pwd 确认当前位于 lab-13 目录。
提交:
班级_学号_姓名_第13次课_Terraform计划与云存储报告.docx只提交一个 Word 到智慧职教“第13次课”。不提交 .terraform/、terraform.tfstate*、*.tfplan、私密 *.tfvars、.env、AccessKey 或完整控制台页面。
检查工作流、计划动作、状态与凭据、OSS 设计和 plan-only 边界。
这组题把阶段排障、OpenStack 与阿里云资源映射、ECS 生命周期边界和 Terraform 计划放在同一张变更评审表里。作答时注意区分“文档或计划能证明什么”和“真实资源已经发生了什么”。
用 4 道跨课题复查故障证据、OpenStack 映射、生命周期风险和 Terraform 计划。
用 6 道题检查 Terraform 工作流、plan、state、敏感数据和 OSS 设计。
fmt 管样式,validate 管语法与内部一致性,plan 展示拟议变更。plan 不会执行变更,apply 才会改变真实对象。下一次课将回到 Compose,把目录、配置、健康检查和从空目录重建整理成可交付标准。
为下一步整理一个交接包:保留脱敏后的配置与 plan 摘要,确认 state、计划文件、.env 和私密变量没有进入提交目录,并写清“未执行 apply”。接下来的 Compose 应用交付也沿用“配置可审、运行文件受控、执行结果可验”的边界。
以下资料在 2026-07-28 核对:
助教会读取当前课程页面和结构化学习记录,但不会读取正文实验框里的原始聊天。