使用terraform在AWS中部署相当大的基础架构时,我们的远程tfstate
已损坏并被删除。
从文档中,我收集terraform refresh
应查询AWS以获取基础结构的真实状态并按顺序更新tfstate,但这不会发生:我的tfstate未受影响且计划+应用给了很多Already existing
错误。
terraform refresh
真正做了什么?
答案 0 :(得分:19)
terraform refresh
尝试查找状态文件中保存的所有资源,并使用自上次运行以来在Terraform之外的提供程序中发生的任何漂移进行更新。
例如,假设您的状态文件包含3个EC2实例,其实例ID为i-abc123
,i-abc124
,i-abc125
,然后您删除Terraform之外的i-abc124
。运行terraform refresh
后,plan
将显示它需要创建第二个实例,而销毁计划将显示它只需要销毁第一个和第三个实例(并且不会破坏丢失的第二个实例)实例)。
Terraform做出了非常具体的决定,不会干扰Terraform不管理的事情。这意味着如果资源在其状态文件中不存在,那么绝对不会以任何方式触及它。这使您可以与其他工具一起运行Terraform以及在AWS控制台中进行手动更改。这也意味着您可以通过提供不同的状态文件来在不同的上下文中运行Terraform,从而允许您将基础架构拆分为多个状态文件,从而避免灾难性的状态文件损坏。
为了让自己摆脱目前的漏洞,我建议您自由地使用terraform import
将状态恢复到状态文件中,或者,如果可能的话,手动销毁Terraform之外的所有内容并从头开始。
将来我会建议拆分状态文件以应用更细粒度的上下文,并将远程状态存储在启用了版本控制的S3存储桶中。您还可以查看像Terragrunt这样的工具来锁定您的状态文件以帮助避免损坏或等待即将发布的Terraform 0.9版本中的本机状态文件锁定。
答案 1 :(得分:0)
我知道这对聚会来说有点晚了,但是在最近与terraform的往来中,我读到它仍然保留了本地状态文件tfstate.backup,以防远程状态文件损坏。显然,我还没有尝试过,您可以执行terraform state push
,它将把备份推送到远程。
欢呼
答案 2 :(得分:0)
计划->
在上述场景中,删除了第二个EC2实例,并使用 terraform plan
重试时,它确实刷新了地形状态,但在计划之前在内存中。
刷新后的状态将用于计算此计划,但不会
保留在本地或远程状态存储中。
刷新->
但是,如果我单独运行terraform refresh
,那么它实际上会刷新本地或远程状态存储中存在的状态文件。
希望您现在得到答案...
答案 3 :(得分:0)
@Philip 看来我是最后一个,继续回答你的问题。
在您来到这里之前,您已经知道 Terraform 刷新将更新任何真实世界漂移的本地状态,并与您的 terraform 模板中的实际基础设施进行比较。
然后,Terraform 只会裁掉不属于您所需配置的部分。
例如: 1.) 需要 1 个规则的 SG,有人手动向 SG 添加另一个规则。 2) 您运行 Terraform Refresh 或 Plan,Terraform 会在您的远程或本地状态下记录下来,并相应地生成一个计划。 3.) 然后在您接下来应用其将删除手动添加的更改。
但如果您想保留这些手动更改,您需要使用 ignore_changes 向您的资源添加生命周期块。
例如:
resource "aws_security_group" "default" {
lifecycle {
ignore_changes = [ingress]
}
}