如何将Terraform状态集成到GitHub Action工作流程中?

7
我有一个 Github action 工作流程,概述了在 Azure 中启动 Terraform 创建资源的简单流程。我缺少的是如何整合 Terraform 状态文件,使得在工作流程的连续运行中,它应该将当前状态与 main.tf 文件进行比较,并仅允许净变化。目前,如果我连续运行它,第二次总是会失败,因为资源已经在 Azure 中创建。
如何配置下面的 Github 工作流程以允许 Terraform 状态文件的比较?我没有发现任何一种方法可以做到这一点。
Github 仓库布局: enter image description here Github action 工作流程:
name: Terraform deploy to Azur

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
    - name: "Checkout"
      uses: actions/checkout@master
      
    - name: "Terraform Init"
      uses: hashicorp/terraform-github-actions@master
      with:
       tf_actions_version: 0.12.13
       tf_actions_subcommand: "init"

    - name: "Terraform Plan"
      uses: hashicorp/terraform-github-actions@master
      with:
       tf_actions_version: 0.12.13
       tf_actions_subcommand: "plan"
       args: -var="client_secret=${{ secrets.clientSecret }}"
             -var="client_id=${{ secrets.clientId }}"
             -var="tenant_id=${{ secrets.tenantId }}"
             -var="sub=${{ secrets.sub }}"
                  
    - name: "Terraform Apply"
      uses: hashicorp/terraform-github-actions@master
      with:
       tf_actions_version: 0.12.13
       tf_actions_subcommand: "apply"
       args: -var="client_secret=${{ secrets.clientSecret }}"
             -var="client_id=${{ secrets.clientId }}"
             -var="tenant_id=${{ secrets.tenantId }}"
             -var="sub=${{ secrets.sub }}"    
3个回答

7

您需要为 Terraform 添加后端配置,以便它可以将状态文件存储在一个外部位置,并且可以在每次运行时引用和更新该文件。


2
这就是原因,为什么错过了它,因为我同时在寻求保护后端,即不要像“access_key = hardcoded guid”这样调用,所以我还需要阅读有关环境变量和存储机密的内容。 - Sauron

0
一个比将后端配置存储在其他地方更好的解决方案是,在管道中运行时,在terraform init之前动态生成后端配置。
    - name: Setup Terraform Backend
      id: backend
      run: |
        cat > backend.tf << EOF
        terraform {
          backend "remote" {
            organization = "${secrets.TF_CLOUD_ORGANIZATION}"

            workspaces {
              name = "${secrets.TF_CLOUD_WORKSPACE}"
            }
          }
        }
        EOF

    - name: Terraform Init
      id: init
      run: terraform init

为什么动态生成后端配置是更好的解决方案? - theborngeek
它允许您在通常无法使用变量的情况下使用变量。如果您想要能够将代码重复使用于多个部署中,则变量使用至关重要。 - Dustin

0
如果您使用的是Terraform云,则我已经做了以下事情:
  • 按照下面的示例,为每个环境/工作区创建一个文件
workspaces { name = "dev" }
hostname     = "app.terraform.io"
organization = "terraform-cloud-orgid"

创建另一个名为backend.tf的文件,其内容如下。
//Donot uncomment this file. This file will be uncommented only in Github Actions
#terraform {
#   backend "remote" {}
#}

现在,在您的Github Actions中添加以下行,取消注释backend.tf以反映和选择特定的后端文件。
      - name: Uncomment Terraform Cloud Backend Configuration file
        id: uncomment
        run: sed -i 's/^#*//' backend.tf

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v2
        with:
          terraform_version: 1.1.0
          cli_config_credentials_token: ${{ secrets.TF_API_TOKEN }}

      - name: Terraform Init
        id: init
        run: terraform init -backend-config=dev.hcl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接