将 GitHub Actions 工作流程中的输入值绕过到 terraform 变量文件

Posted

技术标签:

【中文标题】将 GitHub Actions 工作流程中的输入值绕过到 terraform 变量文件【英文标题】:bypass input values in GitHub Actions workflow to a terraform variables file 【发布时间】:2021-12-10 23:27:45 【问题描述】:

作为使用 terraform 通过 GitHub 操作配置谷歌云资源的一部分,我需要使用 terraform 变量文件绕过一些输入值,问题是 THL 不支持 Golang。

我已尝试执行以下操作:

    使用创建 GitHub 操作工作流
  workflow_dispatch:
    inputs:
      new_planet:
        description: 'Bucket Name'
        required: true
        default: 'some bucket'

在工作流程结束时:

- name: terraform plan
        id: plan
        run: |
          terraform plan -var-file=variables.tf

在 variables.tf 中:

variable "backend_bucket" 
  type = string
  default = $ github.event.inputs.new_planet 
  description = "The backend bucket name"

如果您知道如何将工作流程中的输入值绕过到 terraform 中,我将不胜感激。

【问题讨论】:

【参考方案1】:

您可以在命令行 [1] 中使用backend-config 选项。您首先需要配置后端(例如,通过创建 backend.tf 文件)并添加以下内容:

terraform 
  backend "s3" 
  

这样,每次运行terraform init 时都会提示您输入。但是,还有一个额外的 CLI 选项 -input=false 可以防止 Terraform 请求输入。下面的这个 sn-p 将移动到 Terraform 代码所在的目录(取决于 repo 的名称,目录名称会有所不同)并运行 terraform init 并使用 -backend-config 选项以及 -input 设置为false:

      - name: Terraform Init
        id: init
        run: |
          cd terraform-code
          terraform init -backend-config="bucket=$ secrets.STATE_BUCKET_NAME " \
             -backend-config="key=$ secrets.STATE_KEY " \
             -backend-config="region=$ secrets.AWS_REGION " \
             -backend-config="access_key=$ secrets.AWS_ACCESS_KEY_ID " \
             -backend-config="secret_key=$ secrets.AWS_SECRET_ACCESS_KEY " \
             -input=false -no-color

我想您不希望存储桶的名称和其他敏感值被硬编码,我建议使用 GitHub Actions 机密 [2]。

设置完成后,您可以运行terraform plan,而无需为后端配置指定变量。另一方面,您可以在前面的步骤中创建一个terraform.tfvars 文件,以便计划步骤使用它。这是我的一个例子:

      - name: Terraform Tfvars
        id: tfvars
        run: |
          cd terraform-code
          cat << EOF > terraform.tfvars 
            profile                 = "profilename"
            aws_region              = "us-east-1"
          EOF

您将使用以下 sn-p 结束(再次注意 -input=false

      - name: Terraform Plan
        id: plan
        run: |
          cd terraform-code        
          terraform plan -no-color -input=false
        continue-on-error: true

所有 terraform 部分都可以通过 Hashicorp [3] 提供的 GitHub Action 获得。


[1]https://www.terraform.io/docs/language/settings/backends/configuration.html#partial-configuration

[2]https://docs.github.com/en/actions/security-guides/encrypted-secrets

[3]https://github.com/hashicorp/setup-terraform

【讨论】:

我不确定你是否理解我的问题,后端是一个不好的例子。 我做到了。您希望将后端存储桶名称作为变量传递,但为了避免必须提供任何输入,因此我阐述了如何在不进行任何硬编码的情况下正确执行此操作。

以上是关于将 GitHub Actions 工作流程中的输入值绕过到 terraform 变量文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将降价页面附加到 GitHub Actions 工作流程运行摘要?

是否可以在 GitHub Actions 中的 Actions 之间保留 WORKDIR?

将 Go 项目从 Travis 迁移至 GitHub Actions

在线工作坊 | 使用 GitHub Actions 实现自动化开发

如何在本地运行 GitHub Actions 工作流程?

在 GitHub Actions 工作流程中缓存 APT 包