terraform plan
和destroy
如何与状态文件相关。
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对象。类似于plan
或apply
的terraform destroy
仍将使用状态文件作为其对现实世界的理解(Azure中的当前状态)。如果从Terraform代码中删除Terraform对象,destroy
将对状态文件进行交叉检查,并注意到该资源存在于状态文件中。由于它存在于状态文件中,但正在从代码中删除,Terraform将发送一个销毁该资源的请求。
看看下面的一些场景,你可以尝试一下,这可能会帮助你更好地理解。
场景1
- 假设您从Azure门户创建了一个名为
ststorageaccount
的存储帐户 - 然后继续编写Terraform代码以创建相同的存储帐户并执行
terraform plan
。您会注意到,执行计划不知道此存储帐户已经存在,并且执行计划显示尝试再次创建该帐户 - 由于该计划是"成功的",因此您可以继续进行
terraform apply
。您现在收到一个错误,指出存储帐户ststorageaccount
已经存在,需要导入到状态文件中。terraform apply
阶段是Terraform的azurerm provider
开始与Azure API交互以创建资源。Azure API知道Azure中的状态,是将该错误提交给Terraform并随后提交给您的API - 由于Terraform无法成功创建存储帐户,它不会将其添加到状态文件中,而是要求您手动导入
场景2
- 您编写Terraform代码以在
South East Asia
区域中创建某个资源 - 您执行一个
terraform plan
,由于Terraform只根据Terraform的azurerm provider
验证您的代码,它向您展示了一个成功的执行计划 - 您继续使用
terraform apply
,但现在收到一个错误,说区域是错误的,必须改为SouthEastAsia
(没有空格) - 发生这种情况是因为Terraform
azurerm provider
接受South East Asia
,而该特定资源的Azure API要求以不同的方式编写区域
因此,您可以看到这两个案例显示了terraform plan
和terraform apply
在两个不同的"平面"上工作时的不同行为。