如何将Terraform plan和Terraform destroy与状态文件相关联?

5
terraform plandestroy命令如何与状态文件相关联?
当Terraform执行plan时,
  • 它是通过直接检查azurerm api,还是参考状态文件来知道我们清单文件中的期望状态与Azure门户中资源的当前状态是否相同?

  • 如果它参考状态文件,那么在第一次计划时,terraform plan如何得到验证,因为它还没有状态文件(因为只有terraform apply会生成状态文件)?

  • 其次,terraform destroy命令是否与我们的清单文件(期望的配置文件)有关,还是只验证状态文件与当前状态(Azure门户中资源的实际状态)?


什么是“清单文件”? - Marcin
terraform 文件 - Vowneee
1个回答

4

一些基本解释:

Terraform plan 基本上是针对 terraform 的 azurerm provider 验证你的代码,检查你的代码是否正确,是否满足 Azure API 的要求(例如,使用正确的属性、类型等)。如果一切顺利,它会进行干运行并显示在执行 terraform apply 时会发生什么。此时,terraform 不知道 Azure 中存在什么或不存在什么,它只进行干运行,给你一个想法。这意味着即使您的 terraform plan 成功,terraform apply 并不一定成功。

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

现在回答你的问题:

它是如何知道我们清单文件中所需的状态与 azure 门户中资源的当前状态相同?是通过直接检查 azurerm api 还是通过参考状态文件?

对于由 Terraform 创建的任何资源,Terraform 将始终针对状态文件进行验证。它与 Azure API 进行交互的唯一时间是当它必须与资源交互时。

如果它正在参考状态文件,当它还没有状态文件(因为只有 terraform apply 才会生成状态文件)时,terraform plan 该如何进行第一次计划验证?

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

其次,terraform destroy 命令是否与我们的清单文件(期望的配置文件)有任何关联,还是只会使用状态文件与当前状态(Azure 门户中资源的实际状态)进行验证?

当 Terraform 对象保存在状态文件中时,它们与 Azure 对象耦合在一起,使用 Azure 资源 ID。类似于计划或应用程序,terraform destroy 仍将使用状态文件作为其对真实世界(Azure 中的当前状态)的理解。如果从 Terraform 代码中删除了 Terraform 对象,则 destroy 将针对状态文件进行交叉检查,并注意到此资源存在于状态文件中。由于它存在于状态文件中,但正在从您的代码中删除,因此 Terraform 将发送请求以销毁该资源。

以下是一些场景,您可以尝试并了解更多。

场景1

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

场景2

  1. 您编写了Terraform代码以在东南亚地区创建某些资源。
  2. 您执行terraform plan,因为Terraform只验证您的代码与Terraform的azurerm provider是否一致,因此会显示成功的执行计划。
  3. 您继续使用terraform apply,但是现在收到一个错误,指出区域错误,应该是SouthEastAsia(没有空格)。
  4. 这是因为Terraform的azurerm provider接受South East Asia,而该特定资源的Azure API要求区域写法不同。

所以您可以看到,这些都是两种情况,展示了terraform planterraform apply在不同层面上的操作差异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接