如何在 gitlab 中删除 terraform 资源?

Posted

技术标签:

【中文标题】如何在 gitlab 中删除 terraform 资源?【英文标题】:how to delete terraform resources in gitlab? 【发布时间】:2022-01-15 21:12:59 【问题描述】:

我通过 gitlab 创建资源,但无法删除。一开始,我将计划输出到工件以在 apply 中应用它。然后创建资源,创建后我想删除它们。但是删除它们是行不通的,不可能像计划一样将它们输出到out,如果我只是在终端中键入destroy,那么作业运行成功,但是删除了0个资源。 my.gitlab-ci.yaml 是这样的

stages:
  - validate
  - plan
  - apply
  - destroy

before_script:
  - rm -rf .terraform
  - export AWS_ACCESS_KEY_ID
  - export AWS_SECRET_ACCESS_KEY  
  - terraform init

validate:
  stage: validate
  script:    
    - terraform validate
  tags:
    - shell-runner

plan:
  stage: plan
  script:
    - terraform plan -out "planfile"
  dependencies:
    - validate
  artifacts:
    paths:      
      - "planfile"      
  tags:
    - shell-runner
      
apply:
  stage: apply
  script:
    - terraform apply -input=false -auto-approve   
  dependencies:
     - plan
  tags:
    - shell-runner
  when: manual

destroy:
  stage: destroy
  script:
    - terraform destroy -state="planfile" -auto-approve
  tags:
    - shell-runner
  when: manual

【问题讨论】:

Terraform 命令的用法不正确。您应该检查 Terraform CLI 的文档并修复它们,然后您将获得预期的行为。 【参考方案1】:

我找到了一种解决方案 + 可以通过 s3 存储桶完成 https://docs.gitlab.com/ee/user/infrastructure/iac/terraform_state.html

【讨论】:

【参考方案2】:

您将Terraform state 与Terraform plan 混淆了。

Terraform state 是一个集中文件,用于存储有关您的所有基础架构的信息。

Terraform 计划是一个临时文件,仅包含计划中的更改。

请正确设置Terraform state location,销毁时不要将计划文件设置为状态文件。除了local,您需要任何后端类型。

【讨论】:

你的意思是这样做?脚本:- terraform destroy -state="terraform.tfstate" -auto-approve 您不必传递 -state 参数(terraform.state 是它的默认值 btw)。当您设置远程后端时,这将自动工作。本地后端不适用于 Gilab CI(和任何其他 CI),因为每个作业都在干净的环境中运行。 Shell 执行器使情况变得更糟。 如果我理解正确,那么你需要编写 terraform destroy -auto-approve,因为这是在远程服务器上完成的,它应该触发和删除资源。但其实我也试过了。并且还删除了 0 个资源。也许我很笨,但如果你能写出你需要的东西,以便将其删除,那么我将能够将我的逻辑链执行到最后

以上是关于如何在 gitlab 中删除 terraform 资源?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 terraform 状态中删除资源?

如何使用 Terraform 附加或删除安全组的入口/出口规则?

SSH 密钥未受保护的 terraform ansible jenkins

如何使用变量在 terraform GCP 上添加或删除 access_config

如何在GitLab存储库中删除Tag

如何删除 Gitlab 自托管中的旧工件?