首页 > 解决方案 > gitlab-ci terraform 状态锁文件根除

问题描述

在尝试迁移我的后端配置以使用带有 gitlab 的新状态存储时,我遇到了这个光荣的问题:我的状态被锁定。

Error: Error copying state from the previous "local" backend to the newly configured
"http" backend:
    Failed to upload state: POST http://internal.host/api/v4/projects/14/terraform/state/project-name giving up after 3 attempts

我忍无可忍了。我确实尝试检查 /var/log/gitlab/gitlab-rails/production_json.log 中的喋喋不休是否提供了相关的东西,并且对它没有更多的把握和理智。

是否有一个sudo pretty-please-with-sugar-on-top-clean-the-fn-lock没有任何把关的命令?

标签: terraformgitlab-ci

解决方案


我在将 terraform 状态文件从 s3 迁移到 gitlab 时遇到了同样的问题。我造成了这个问题,因为我在 backend_config unlock_address 中有错字,并且在 init 仍在运行时插入了 Control+C。terraform init 没有要求我将状态从 s3 迁移到 gitlab,但我被锁定并且强制解锁无法以任何方式工作。

我带来的解决方案:

  1. 将 backend.tf 配置为使用之前使用的 lock_address 作为解锁地址并重新初始化 terraform。
  2. Terraform 计划现在应该可以正常工作了。
  3. 重新配置 backend.tf 以继续进行状态迁移。通过再次迁移,使用您想要的 URL 重新初始化 terraform 状态 URL。

例如,这是我使用的 terraform init,其中所需的地址是 <TF_State_Name> 并且我有一个错字 <TF_State_Name_B> 。我用 control+C 打断了:

terraform init \
 -backend-config="address=https://<gitlab_url>/api/v4/projects/<ProjectID>/terraform/state/<TF_State_Name>" \ 
 -backend-config="lock_address=https://<gitlab_url>/api/v4/projects/<ProjectID>/terraform/state/<TF_State_Name>/lock" \    
 -backend-config="unlock_address=https://<gitlab_url>/api/v4/projects/<ProjectID>/terraform/state/<TF_State_Name_B>/lock" \
 -backend-config="username=<user>" \     
 -backend-config="password=<password>" \   
 -backend-config="lock_method=POST" \    
 -backend-config="unlock_method=DELETE" \
 -backend-config="retry_wait_min=5"

这就是我重新配置 terraform init 以绕过锁的方式。

terraform init \
 -backend-config="address=https://<gitlab_url>/api/v4/projects/<ProjectID>/terraform/state/<TF_State_Name_B>" \ 
 -backend-config="lock_address=https://<gitlab_url>/api/v4/projects/<ProjectID>/terraform/state/<TF_State_Name_B>/lock" \    
 -backend-config="unlock_address=https://<gitlab_url>/api/v4/projects/<ProjectID>/terraform/state/<TF_State_Name_B>/lock" \
 -backend-config="username=<user>" \     
 -backend-config="password=<password>" \   
 -backend-config="lock_method=POST" \    
 -backend-config="unlock_method=DELETE" \
 -backend-config="retry_wait_min=5"

最后,您应该重新配置到所需的地址。


推荐阅读