在我的 Terraform Cloud 工作区中加载特定的 tfvars 变量文件

Eva*_*tti 4 terraform

我希望指定要.tfvars在我的工作区中加载哪个文件。

\n\n

与在工作区中输入所有内容相比,使用文件管理变量要容易得多。我会解释一下。

\n\n

我有两个工作空间:

\n\n
    \n
  • database-qa
  • \n
  • database-prod
  • \n
\n\n

工作区的存储库如下所示:

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 database/\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.tf\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.qa.tfvars\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.prod.tfvars\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想main.qa.tfvarsdatabase-qa工作区加载,自然地main.prod.tfvarsdatabase-prod工作区加载。

\n\n

为了安全起见,我将机密/密码保留在工作区变量上,并使用tfvars来进行非敏感配置,例如名称、版本等,以方便起见。我发现这比将所有变量添加到云中的工作区要容易得多。

\n\n

我检查了文档,但找不到方法。

\n\n

可以选择使用文件名的*.auto.tfvars 变量定义,但最终会加载qa文件prod并且无法正常工作。

\n\n

有可能做到吗?有哪些替代方案?

\n

Ant*_*ine 6

一种解决方案是在根目录上创建通用 Terraform 代码,并为每个环境创建一个目录。

\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 database/\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.tf\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 qa/\n\xe2\x94\x82   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 qa.auto.tfvars\n\xe2\x94\x82   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 root.tf\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 prod/\n\xe2\x94\x82   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 prod.auto.tfvars\n\xe2\x94\x82   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 root.tf\n
Run Code Online (Sandbox Code Playgroud)\n

在 中root.tf,只需将根目录指向本地模块即可。

\n
module "database" {\n  source  = "../"\n  cpu = var.cpu\n}\n\n[...]\n
Run Code Online (Sandbox Code Playgroud)\n

在 Terraform Cloud 上,对于每个工作区,General Settings您必须覆盖Terraform Working Directory,并配置目录qaprod.

\n

就是这样!

\n


Eva*_*tti 5

经过大量阅读和帮助该线程后,我找到了解决方案/解决方法。

首先,Terraform Cloud.tfvars目前不支持在工作区运行中指定要加载的文件。目前尚不清楚是否有计划积压。

然而,Terraform CLI 通过以下命令支持它,如果您创建管道,它可以正常工作,但手动运行它有风险。

-var-file=<filename>.tfvars
Run Code Online (Sandbox Code Playgroud)

由于我使用 Terraform Cloud,我最终得到了以下配置。必须将其复制到所有工作区,但它可以工作。

variable "TFC_WORKSPACE_NAME" {
  type = string
}

locals {
  env = merge(
    yamldecode(file("env/${var.TFC_WORKSPACE_NAME}.yaml"))
  )
}

resource "azurerm_resource_group" "group" {
  name     = local.env.group
  location = local.env.location
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您可以使用“${terraform.workspace}”,因此您可能不需要 TFC_WORKSPACE_NAME (3认同)