Terraform - 为什么需要状态文件?

问题描述 投票:0回答:1

在Plan和Apply之前,terraform总是刷新状态文件。 那么状态文件真正需要什么?

如果需要跟踪IaC创建的资源,它可以只保留资源的ID。为什么要详细说明?

terraform infrastructure-as-code
1个回答
3
投票

Terraform 具有非常通用的设计,因此它可以支持尽可能多的不同远程系统。虽然许多远程对象确实有一个明显的单一 ID 来唯一标识它们,但也有一些远程对象类型是通过值的组合来唯一标识的,甚至在某些情况下整个配置充当对象的标识。

此外,一些远程系统具有只写属性,如果未将其保存在 Terraform 状态,则提供者将无法恢复这些属性。

状态文件包含提供者在最近操作后返回的整个对象的逐字副本,然后在计划下一个操作时,Terraform 将该整个对象发送回提供者。然后,提供者本身决定使用该数据的哪个子集来确定该资源实例代表哪个远程对象。

对于许多资源类型,您会发现,如果您直接编辑状态快照以删除除

id
属性之外的所有内容,则提供程序仍将成功刷新对象并重新填充您删除的所有其他数据,但事实并非如此永远正确。 Terraform 本身不知道提供者需要什么来完成其工作,因此它总是只存储整个对象。

尽管 Terraform 不知道什么是重要的、什么是不重要的核心问题是原始驱动程序,但 Terraform 存储整个对象的事实还有一些其他好处:

  • 在大多数情况下,提供商可以检测对象是否已在 Terraform 之外发生更改,并在计划中添加附加注释(如果这可能有助于解释提供商建议撤消该更改的原因)。

    通过第三个数据源进行比较,Terraform 可以提示远程系统和配置之间的不匹配是由更改配置还是更改远程系统引起的。

  • terraform console
    terraform show
    等额外功能可以允许检查对象数据,而无需从源系统重新获取所有内容。

    Terraform 原则上可以从远程 API 再次刷新所有数据,但由于 Terraform 已经存储了数据的副本,因此返回该数据副本会更快(因此在调试时更方便)。

官方文档部分Terraform State的用途有更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.