Terraform云配置动态工作区名称

Fuc*_*zak 6 terraform devops hashicorp

我正在使用 GitHub Actions 和 Terraform 构建 CI/CD 管道。我有一个如下所示的 main.tf 文件,我从多个环境的 GitHub 操作中调用该文件。我正在使用https://github.com/hashicorp/setup-terraform与 GitHub 操作中的 Terraform 进行交互。我有 MyService 组件,并且正在部署到 DEV、UAT 和 PROD 环境。我想在所有环境中重用 main.tf 并动态设置工作区名称,如下所示:MyService-DEV、MyService-UAT、MyService-PROD。terraform/cloud 块中不允许使用变量。我正在使用 HashiCorp 云来存储状态。

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 2.0"
    }
  }

  cloud {
    organization = "tf-organization"
    workspaces {
      name = "MyService-${env.envname}" #<==not allowed to use variables
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

更新

我终于成功地启动并运行了这个程序并提供了有用的评论。以下是我的发现:

  • TF_WORKSPACE 需要预先定义,例如:service-dev
  • 在自动化运行时,我没有让标签按照我想要的方式工作。如果我将 cloud.workspaces.tags 中的标签定义为“service”,则无法动态设置第二个标签(如“dev”)。在 init ['service', 'dev'] 期间需要这两个标签,以便 TF 自动选择工作区 service-dev。
  • 我最终使用 tfe 提供程序来自动设置工作区(带标签)。最后我还是需要设置 TF_WORKSPACE=service-dev

Mar*_*ins 4

作为块内块terraform.workspace的一部分进行引用是没有意义的,因为该块定义了 Terraform 将使用哪些远程工作空间,因此决定了配置的其余部分中的最终值。workspacescloudterraform.workspace

要声明您的 Terraform 配置属于 Terraform Cloud 中的多个工作区,您可以为每个工作区分配标签“MyService”,然后使用该参数tags而不是参数name

  cloud {
    organization = "tf-organization"
    workspaces {
      tags = ["MyService"]
    }
  }
Run Code Online (Sandbox Code Playgroud)

如果您将该标签分配给 Terraform Cloud 中的假设MyService-dev工作MyService-prod区,然后使用上面的配置进行初始化,那么terraform workspace在该目录中工作时,Terraform 将使用命令显示这两个工作区以供选择。

terraform.workspace然后将显示为 或MyService-devMyService-prod具体取决于您选择的选项。