Terraform计划和Terraform销毁如何与状态文件相关



terraform plandestroy如何与状态文件相关。

Terraform执行plan时,

  • 它如何知道我们的清单文件中所需的状态与azure门户中资源的当前状态相同?是通过直接使用azurermapi进行检查,还是通过引用状态文件进行检查?

  • 如果它引用的是状态文件,那么在地形图还没有状态文件的情况下(因为它只是一个terraform apply,将生成状态文件),地形图如何首次验证?

  • 其次,terraform destroy命令是否引用了我们的清单文件(所需的配置文件),或者它只是用当前状态(azure门户中的资源实际状态)验证状态文件

一些基本解释:

terraform plan基本上根据地形azurerm provider验证您的代码,以检查您的代码是否正确,是否满足Azure API的要求(例如使用正确的属性、类型等)。如果一切都很好,它会做一次预演,向你展示当你做terraform apply时会发生什么。在这一点上,地形并不知道Azure中存在什么或不存在什么,它只是做了一次预演来给你一个想法。这意味着即使你的terraform plan成功了,你的terraform apply也不一定会成功。

请记住,azurerm provider更像是Azure API之上的包装器。它根据Azure API的要求进行自己的验证。

现在回答您的问题:

它如何知道我们的清单文件中所需的状态与azure门户中资源的当前状态相同?是通过直接使用azurermapi进行检查,还是通过引用状态文件进行检查?

对于Terraform创建的任何资源,Terraform将根据状态文件always进行验证。它与Azure API进行检查的唯一时间是当它必须与资源交互时。

如果它引用的是状态文件,当地形计划还没有状态文件时,如何对其进行首次验证(因为它只是一个地形应用程序,将生成状态文件?

请参阅基本说明。它可以追溯到terraform plan的工作方式。因为这是一个执行计划,所以它还不需要状态文件。状态文件仅保存在Azure中创建的内容或从Azure导入的内容的信息。它是关于实际现有资源的信息。terraform plan只进行一次试运行/测试/简单验证,让您知道您的代码是否足够好,可以继续执行下一步:terraform apply

其次,terraform destroy命令是否引用了我们的清单文件(所需的配置文件),或者它只是用当前状态(azure门户中的资源实际状态)验证状态文件

当Terraform对象保存在状态文件中时,它们使用Azure资源ID耦合到Azure对象。类似于planapplyterraform destroy仍将使用状态文件作为其对现实世界的理解(Azure中的当前状态)。如果从Terraform代码中删除Terraform对象,destroy将对状态文件进行交叉检查,并注意到该资源存在于状态文件中。由于它存在于状态文件中,但正在从代码中删除,Terraform将发送一个销毁该资源的请求。

看看下面的一些场景,你可以尝试一下,这可能会帮助你更好地理解。

场景1

  1. 假设您从Azure门户创建了一个名为ststorageaccount的存储帐户
  2. 然后继续编写Terraform代码以创建相同的存储帐户并执行terraform plan。您会注意到,执行计划不知道此存储帐户已经存在,并且执行计划显示尝试再次创建该帐户
  3. 由于该计划是"成功的",因此您可以继续进行terraform apply。您现在收到一个错误,指出存储帐户ststorageaccount已经存在,需要导入到状态文件中。terraform apply阶段是Terraform的azurerm provider开始与Azure API交互以创建资源。Azure API知道Azure中的状态,是将该错误提交给Terraform并随后提交给您的API
  4. 由于Terraform无法成功创建存储帐户,它不会将其添加到状态文件中,而是要求您手动导入

场景2

  1. 您编写Terraform代码以在South East Asia区域中创建某个资源
  2. 您执行一个terraform plan,由于Terraform只根据Terraform的azurerm provider验证您的代码,它向您展示了一个成功的执行计划
  3. 您继续使用terraform apply,但现在收到一个错误,说区域是错误的,必须改为SouthEastAsia(没有空格)
  4. 发生这种情况是因为Terraformazurerm provider接受South East Asia,而该特定资源的Azure API要求以不同的方式编写区域

因此,您可以看到这两个案例显示了terraform planterraform apply在两个不同的"平面"上工作时的不同行为。

最新更新