我可以在 Terraform Cloud 上使用 Terragrunt 吗?

Can I use Terragrunt on Terraform Cloud

我有一个包含 Terraform Cloud 的配置管道,我们的领导要求我们使用 Terragrunt 来提高 Terraform 代码质量。

Terragrunt 是一个很好的工具,但我没有看到任何证据表明有人已经在 Terraform Cloud 上成功使用它。

谁能解决这个问题?请只回答如果你

  1. 自己做过,或者
  2. 可以提供可行的文件,或者
  3. 提供证明这不是一个好主意的文件或
  4. 无法使用 Terraform Cloud。

Terrag运行t 期望您执行 运行 terragrunt 命令,而在幕后,它 运行s terraform 命令,传递 TF_VAR_* environment variables。 TFC 也运行s terraform 直接命令。因此,您不能在 TFC 中 运行 Terrag运行t - 它不会执行 terragrunt 二进制文件,只会执行 terraform 二进制文件。

但是,您可以使用 CLI 中的 Terrag运行t 在 TFC 上使用 remote backend 执行 Terraform 运行s。在这种模式下,你 运行 Terrag运行t 像往常一样命令,当 Terraform 被调用时,它实际上在 TFC 中执行。你可以查看TFC中的运行s UI,状态存储在TFC中等。但是,由于上述限制,你实际上不能运行 Terrag运行t 来自 UI.

要设置它,首先您需要获得一个 API 令牌和 configure the CLI with a credentials block in .terraformrc

接下来,您需要 generate 一个 backend 块:

generate "remote_state" {
  path      = "backend.tf"
  if_exists = "overwrite_terragrunt"
  contents = <<EOF
terraform {
  backend "remote" {
    hostname = "app.terraform.io" # Change this to your hostname for TFE
    organization = "your-tfc-organization"
    workspaces {
      name = "your-workspace"
    }
  }
}
EOF
}

此代码会在您的 Terraform 模块旁边生成一个名为 backend.tf 的文件。这指示 Terraform 使用 TFC 作为远程后端。它将使用名为 your-workspace 的工作区。如果此工作区不存在,TFC 将使用 implict workspace creation 自动创建它。在 Terrag运行t.

中调用的每个模块都会有一个工作区

TFC 不支持“库存”Terraform 支持的 TF_VAR_* 环境变量。因此,作为 Terrag运行t 将变量传递给 Terraform 的标准方式的 Terrag运行t inputs 块不起作用。

相反,您可以创建 *.auto.tfvars.json file。您也可以在 Terrag运行t 中生成此文件:

generate "tfvars" {
  path      = "terragrunt.auto.tfvars.json"
  if_exists = "overwrite"
  disable_signature = true
  contents = jsonencode({name = "your-name"})
}

模块所需的所有变量都应作为 JSON 传递给上面的 contents 属性。一种更灵活的模式是使用 locals block 设置变量,然后将它们传递到 content 块中。首选 JSON 以避免类型问题。

最后一个问题是,当自动创建工作区时,它不会具有与云提供商。您可以通过创建 provider.tf 文件在提供程序配置中定义它,但随后凭据是静态的纯文本形式。不好。

相反,您可以在每个工作空间中手动设置环境变量,或者您可以使用 tfe_workspace and tfe_variable 资源通过 Terraform 预先创建它们。建议使用后一种方法,因为它是程序化的,如果您需要轮换凭据,更新起来会容易得多。

在这两种情况下,您都需要为 Terrag运行t 调用的每个模块创建一个工作区。

另请参阅:this blog post on the topic and this content 关于与 Terrag运行t 的集成。

我收到了来自 Gruntwork 的 josh-padnick 的直接回复,说目前还没有具体的计划来完成这项工作,并确认据他所知目前还不能工作。感谢所有的回答!

真正阻止 terragrunt 相当容易地与 tfcloud 中的 VCS 工作区接口的唯一事情是它将所有文件暂存到 terragrunt 缓存,并在其中通过哈希运行目录名称以防止冲突。我们所做的是将一个辅助实用程序组合在一起,以帮助解决这个称为 terrastage 的用例。它使用 terragrunt 库,但不是使用散列名称将文件放入 terragrunt 缓存,它让您可以控制要放置文件的位置,从而可以相当轻松地与 terraform cloud 的 VCS 工作区进行交互。您可以使用相同的方法让 terragrunt 真正与任何原生 terraform 工具一起工作。

如果对大家有帮助,我会把它放在 github 下 JasonPodgorny/terrastage。