0

我正在使用 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
    }
  }
}

更新

我终于设法通过有用的评论来启动并运行它。以下是我的发现:

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

1 回答 1

2

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

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

  cloud {
    organization = "tf-organization"
    workspaces {
      tags = ["MyService"]
    }
  }

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

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

于 2022-01-11T00:58:49.763 回答