管理状态

DockerBeginner
立即练习

介绍

在之前的实验中,你扮演厨师,为机器人(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 也能帮助你快速恢复到已知的正常状态。