跳至主要内容

状态存储和锁定

后端负责存储状态并提供 状态锁定 的 API。状态锁定是可选的。

尽管状态存储在远程,但所有 OpenTofu 命令(例如 tofu consoletofu state 操作、tofu taint 等)将继续像本地状态一样工作。

状态存储

后端确定状态存储的位置。例如,本地(默认)后端将状态存储在磁盘上的本地 JSON 文件中。Consul 后端将状态存储在 Consul 中。这两个后端都提供了锁定功能:本地通过系统 API,Consul 通过锁定 API。

使用非本地后端时,OpenTofu 不会将状态持久化到磁盘上的任何位置,除非发生不可恢复的错误,导致无法将状态写入后端。这种行为对于后端来说是一个主要优势:如果您的状态中包含敏感值,使用远程后端可以让您使用 OpenTofu,而无需将该状态持久化到磁盘上。

如果在将状态持久化到后端时发生错误,OpenTofu 将在本地写入状态。这是为了防止数据丢失。如果发生这种情况,最终用户必须在错误解决后手动将状态推送到远程后端。

手动状态拉取/推送

您仍然可以使用 tofu state pull 命令手动从远程状态检索状态。这将加载您的远程状态并将其输出到标准输出。您可以选择将其保存到文件或执行任何其他操作。

您还可以使用 tofu state push 手动写入状态。**这极其危险,应尽量避免。**这将覆盖远程状态。如有必要,可以使用它进行手动修复。

手动推送状态时,OpenTofu 将尝试保护您免受一些潜在的危险情况的影响

  • **不同的谱系**:“谱系”是在创建状态时分配给状态的唯一 ID。如果谱系不同,则表示状态是在不同时间创建的,并且很可能您正在修改不同的状态。OpenTofu 不允许这样做。

  • **更高的序列号**:每个状态都有一个单调递增的“序列号”。如果目标状态具有更高的序列号,则 OpenTofu 将不允许您写入它,因为这意味着自您尝试写入的状态以来发生了更改。

如果您确信做出了正确的决定,则可以使用 -force 标志绕过这两种保护措施。即使使用 -force 标志,我们也建议在强制覆盖之前使用 tofu state pull 备份状态。

状态锁定

后端负责尽可能支持 状态锁定

并非所有后端都支持锁定。每个后端的文档 包括有关其是否支持锁定的详细信息。

有关状态锁定的更多信息,请查看 专门介绍状态锁定的页面