如何在 terraform 中回滚到以前的状态

Bha*_*anu 7 terraform

我正在处理 terraform 任务并试图了解状态文件的工作原理。我创建了 main.tf 文件,它有

vpc,firewall,subnet,compute_instance
Run Code Online (Sandbox Code Playgroud)

必须在 GCP 中创建。因此,我已将其应用于 GCP 环境并terraform.tfstate创建了一个文件名文件,并将此文件备份到名为 1st-run 的文件夹中。

现在我已经更新了我main.tf

2vpc,2firewalls,2subnets,compute_instance
Run Code Online (Sandbox Code Playgroud)

因为我需要为我的 vm. 添加另一个 nic.Did terraform apply 并且创建了环境并创建了 terraform.tfstate 文件。我将此文件备份到名为2nd-run.

我想回滚我执行第一次运行的环境。我有那个位于 1st-run 文件夹中的状态文件。

通过使用状态文件而不是触摸代码来回滚的命令是什么,以便我的 GCP 环境自动具有

vpc,firewall,subnet,compute_instance
Run Code Online (Sandbox Code Playgroud)

这是我第一次执行的。

Nag*_*gev 11

虽然有操作 state的命令,但没有回滚到前一个状态(即最后一个状态之前)的命令terraform apply

但是,如果您使用带有dynamodb 锁表的远程 S3 后端,并且在 S3 存储桶上启用了版本控制,则可以回滚。例如,您可以复制以前的版本,使其成为最新版本。然后,您还必须更新 dynamodb 表中的摘要,否则将向您显示如下消息:terraform init

Error refreshing state: state data in S3 does not have the expected content.

This may be caused by unusually long delays in S3 processing a previous state
update.  Please wait for a minute or two and try again. If this problem
persists, and neither S3 nor DynamoDB are experiencing an outage, you may need
to manually verify the remote state and update the Digest value stored in the
DynamoDB table to the following value: vvvvvvvvvvvvvv
Run Code Online (Sandbox Code Playgroud)

您只需使用该值来更新表即可完成回滚。要恢复它,只需从 S3 存储桶中删除最后一个状态,使其返回到旧的“最新”状态,并将 dynamodb 表更新回相应的摘要。

请注意,远程状态是与您的同事共享的,因此应避免上述过程。

重要的是要了解更改状态文件本身不会更改基础设施。这应该通过对 terraform 代码进行版本控制并terraform planterraform apply描述所需基础设施的代码上进行操作来完成。


Mar*_*ins 10

目前无法回滚到 Terraform 中的状态文件中描述的先前状态。Terraform 总是计划更改,目标是从先前状态(最新状态快照)移动到由配置表示的目标状态。Terraform 还为状态中未跟踪的信息使用配置,例如提供程序配置。

在 Terraform 中表示“回滚”的常用方法是将您的配置置于版本控制中并在每次更改之前提交,然后您可以根据需要使用版本控制系统的功能恢复到旧配置。

但是,并非所有更改都可以完全通过还原 VCS 更改来回滚。例如,如果您provider在一次提交中为该提供程序添加了一个新块和资源,然后应用了结果,为了回滚,您需要更改配置以仍然包含该provider块但包含任何resource块,所以你需要在恢复过程中调整配置。然后 Terraform 将使用剩余的provider块来配置提供程序以运行销毁操作,之后您也可以最终删除该provider块。