介绍
在之前的实验中,你扮演厨师,为机器人(Terraform)编写菜单(配置),让它负责烹饪(构建)。但是,机器人如何记住自己已经烹饪了什么?
想象一下:你有一座仓库,却丢失了库存清单。你不知道仓库里有什么、物品在哪里,也不知道是否有东西被偷走。
在 Terraform 中,这份库存清单称为状态(state)。它就是 Terraform 的记忆,记录 Terraform 创建了哪些资源,并将配置中的对象映射到现实中的基础设施对象。
状态让声明式管理成为现实。没有状态,Terraform 虽然可以读取你的文件,却无法可靠地记住哪些现实对象对应这些声明。
状态是 Terraform 最重要的概念之一。没有它,Terraform 就不知道哪些资源已经存在、哪些资源发生了变化,以及哪些资源需要更新或重新创建。
在本实验中,你将了解 Terraform 如何使用状态来保持基础设施正常运行。你会扮演「混沌」的角色,手动破坏资源,然后观察 Terraform 如何检测损坏并自动「修复」系统。
检查状态
我们已经为你预先配置好了实验环境。当前目录中存在 main.tf 文件,并且已经运行过 terraform apply。这表示基础设施(一个 Docker 容器)已经在运行。
先确认容器正在运行:
sudo docker ps
你应该会看到一个名为 tutorial 的容器。
接着查看当前目录中的文件。你会看到 terraform.tfstate。
ls -l
这个文件是 Terraform 的「秘密日记」,会在其中记录它执行的所有操作。查看该文件的内容:
cat terraform.tfstate
输出采用一种名为 JSON 的格式。刚开始看起来可能比较复杂,但它只是计算机用来记录信息的一种结构化方式。
在输出的某处,你会看到 docker_container 以及正在运行的容器 ID。这证明 Terraform「知道」这个特定容器的存在。
重要规则:不要手动编辑这个文件。如果修改它,Terraform 可能会「失忆」,并意外删除或损坏你的基础设施。始终让 Terraform 自己管理这份日记。
这个警告很重要,因为状态是具有权威性的元数据,而不只是日志。损坏状态可能导致 Terraform 在之后做出破坏性或令人困惑的决策。
制造漂移
Terraform 认为自己应该是管理这些资源的唯一负责人。但在现实环境中,各种情况都可能发生:服务器可能崩溃,同事也可能误手动删除某些内容。
这种情况称为漂移(Drift),意思是「现实状态」不再符合「计划」。
在共享环境中,漂移很常见,因为人员、脚本、崩溃和外部系统都可能在 Terraform 正常控制流程之外修改基础设施。
现在制造一些混乱。我们绕过 Terraform,直接使用 Docker 命令删除容器。
sudo docker rm -f tutorial
确认容器确实已经被删除:
sudo docker ps
此时,问题如下:
- 现实状态:容器已经停止并被删除。
- 状态文件:Terraform 认为 容器仍然存在(因为没有人告诉它实际情况)。
检测漂移
现在查看 Terraform 是否注意到了这个「丢失」的容器。
运行 terraform plan 时,Terraform 首先会执行「刷新(Refresh)」操作。它会向 Docker 查询:「ID 为 XYZ 的容器还存在吗?」
运行计划命令:
terraform plan
仔细查看输出。你应该会看到:docker_container.nginx: Refreshing state...
随后,Terraform 会显示一个带绿色 + 号的计划,表示要创建资源。
Terraform will perform the following actions:
## docker_container.nginx will be created
+ resource "docker_container" "nginx" { ... }
Terraform 找到了问题。它的判断过程是:「我的计划要求存在一个容器,但现实中没有容器。因此,我必须创建一个新容器,以达到期望状态。」
这种协调行为是 Terraform 最重要的运维特性之一。Terraform 会比较期望状态、记录的状态和实际运行状态,从而决定需要采取什么修正措施。
修复基础设施
这就是基础设施即代码的「自我修复」能力。因为代码定义了期望状态(一个正在运行的容器),所以 Terraform 可以自动修复发生的任何漂移。
运行 apply 修复问题:
terraform apply
出现提示时输入 yes。
操作完成后,再次检查 Docker:
sudo docker ps
容器回来了!它可能拥有新的 ID,也可能是一个全新的实例,但从功能上看,你的基础设施已经恢复为蓝图中定义的状态。
总结
在本实验中,你见证了状态(State)的作用。
你学习了:
- 状态文件:Terraform 用来记录现有资源的记忆(
terraform.tfstate)。 - 漂移检测:Terraform 如何发现资源在不知情的情况下发生变化,例如被手动删除。
- 自我修复:
terraform apply如何自动恢复缺失的资源,使其与代码保持一致。
正因为具备这种可靠性,Terraform 才能用于管理关键基础设施。即使发生灾难,Terraform 也能帮助你快速恢复到已知的正常状态。



