有时天灾人祸, 当本人尝试利用terraform 创建1个vm时, 当执行到最后一步时出现了问题

从日志看出, 其实资源能正确创建, 但是同步state file时出现了问题, 这个项目的state file是存放在GCS /bucket 上的。
backend.tf
terraform {
backend "gcs" {
bucket = "jason-hsbc"
prefix = "terraform/state"
}
}
root cause? 日志上写的是网络问题, 估计是踮脚的东西突然塌了几秒
先试下rerun, 其实我已经知道rerun注定失败, 因为这时, gcs 上的state file 并没有这个vm资源, 但是这个vm资源其实已经被创建。
所以当下次执行同样的terraform version时, terraform 还是会尝试创建这个vm资源, 但是其id 已经被上次创建的vm占用. 失败!

解决方法1, 手动删除这个vm, 再重新执行terraform apply
这个方法肯定是work的, 相当有效。
但是过于暴力, 而且在生产环境不一定让开发人员这么做。
解决方法2, 手动更新 state file
具体步骤是先把state file 从gcs download 到本地, 然后把这个vm的资源加上去, 再上传回gcs
这个 方案 又过于技术了, 而且风险更高, 万一改错了别的地方…
有没有自动同步state file的方法呢?
有!
解决方法3, terraform refresh 命令
先看看 terraform refresh的解释:
1.更新状态信息:terraform refresh 从基础设施中获取当前的资源状态,并将这些信息更新到 Terraform 的状态文件中。这样,Terraform 就能了解实际基础设施的当前状态,以便在后续的操作中进行准确的计划和变更。
2.检测变更:通过与当前基础设施进行比较,terraform refresh 可以检测到已经发生的变更。它会比较基础设施中的资源属性和 Terraform 状态文件中的资源属性,并标记出任何不匹配的地方。
3.同步状态:如果资源的属性在基础设施中发生了变化,terraform refresh 将更新 Terraform 状态文件中相应资源的属性信息。这样,在后续的计划和应用变更过程中,Terraform 将使用最新的属性信息来确保与基础设施保持一致。
4.识别已删除资源:terraform refresh 还可以识别基础设施中已被删除的资源。它会在 Terraform 的状态文件中标记这些资源,并在后续的计划和应用步骤中通知您这些资源已被删除,以便您可以相应地处理。
上面的解释来自于 chatgpt
通俗地讲
- 可以更新terraform 脚本中定义的资源的属性更新, 例如vm1 被加了1个subnet, 这个change 可以更新回 terraform state.
- 检测上面那种类型的变更, 也就是只检测不修改 : terraform apply -refresh-only
- 跟第一点一样
- 如果某个资源实际上被其他手动在云上删除, 这个命令可以识别, 并把状态更新入state file(实际上也是资源属性更新的一种)
但是!
不支持本文开头介绍的情况 – terraform refresh 不支持 资源已经被创建 而没有写入state file的case
解决方法4, terraform import 命令
看来正主出来了
语法: terraform import 《resource tf address》《resource instance ID》
出现了两个变量, 下面是解释
resource tf address
就是 这个资源的terraform 地址啦
我们可以用 terraform state list 来查看state file 已经注册的所有resource 的 terraform 地址

文章讲述了在使用Terraform创建VM时遇到的状态同步问题,主要介绍了网络问题导致的statefile更新失败,以及解决方法,包括手动删除资源、手动更新statefile、terraformrefresh和terraformimport。最后指出terraformimport不适用于已创建但未写入statefile的情况。
最低0.47元/天 解锁文章
1811

被折叠的 条评论
为什么被折叠?



