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

时间:2019-09-06 11:39:16

标签: terraform

我正在从事Terraform任务,并试图了解状态文件的工作方式。我创建了具有

的main.tf文件
vpc,firewall,subnet,compute_instance

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

现在我用{p>更新了我的main.tf

2vpc,2firewalls,2subnets,compute_instance

因为我需要为我的vm添加另一个网卡,所以terraform的应用和环境的创建以及terraform.tfstate文件的创建。我已将此文件备份到名为2nd-run的文件夹中。

我想回滚我第一次运行的环境。我的状态文件位于第一个运行文件夹中。

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

vpc,firewall,subnet,compute_instance

我第一次执行。

2 个答案:

答案 0 :(得分:2)

无法像今天Terraform中的状态文件中所述回滚到以前的状态。 Terraform始终计划更改,其目标是从先前状态(最新状态快照)转移到配置表示的目标状态。 Terraform还将配置用于状态中未跟踪的信息,例如提供程序配置。

在Terraform中表示“回滚”的通常方法是将配置置于版本控制中,并在每次更改之前提交,然后,如果需要,您可以使用版本控制系统的功能还原为较早的配置。

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

答案 1 :(得分:2)

虽然有用于manipulate state的命令,但是没有命令可以回滚到前一个状态,即在最后一个terraform apply之前。

但是,如果您将remote S3 backenddynamodb lock table一起使用,则可以在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

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

重要的是要了解,更改状态文件不会单独更改基础结构。应该通过对terraform代码进行版本控制,并对描述所需基础结构的代码进行terraform planterraform apply来完成。

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