【问题标题】:Can I use Terragrunt on Terraform Cloud我可以在 Terraform Cloud 上使用 Terragrunt
【发布时间】:2020-05-20 14:16:43
【问题描述】:

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

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

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

  1. 自己完成了这项工作,或者
  2. 可以提供可行的文档,或
  3. 提供文件证明这不是一个好主意或
  4. 无法使用 Terraform Cloud。

【问题讨论】:

  • This article 来自 gruntwork 似乎回答了你的问题。

标签: terraform terragrunt terraform-cloud


【解决方案1】:

Terragrunt 希望您运行 terragrunt 命令,并且在后台运行 terraform 命令,并传递 TF_VAR_* environment variables。 TFC 也直接运行terraform 命令。因此,您不能在 TFC 中运行 Terragrunt - 它不会执行 terragrunt 二进制文件,只会执行 terraform 二进制文件。

但是,您可以使用 CLI 中的 Terragrunt 通过 remote backend 在 TFC 上执行 Terraform 运行。在这种模式下,您像往常一样运行 Terragrunt 命令,当调用 Terraform 时,它实际上在 TFC 中执行。您可以在 TFC UI 中查看运行情况,将状态存储在 TFC 中等。但是,由于上述限制,您无法从 UI 中实际运行 Terragrunt。

要进行此设置,首先您需要获取 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 自动创建它。您在 Terragrunt 中调用的每个模块都会有一个工作区。

TFC 不支持 "stock" Terraform 支持的 TF_VAR_* 环境变量。因此,Terragrunt inputs 块,这是 Terragrunt 将变量传递给 Terraform 的标准方式,不起作用。

相反,您可以创建一个*.auto.tfvars.json file。您也可以在 Terragrunt 中生成此文件:

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

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

最后一个问题是,当工作区自动创建时,它不会具有与云提供商交互所需的 API 凭据(例如 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY)。您可以通过创建provider.tf 文件在提供程序配置中定义它,但是凭据是静态的并且是纯文本的。不好。

相反,您可以手动设置每个工作区中的环境变量,也可以使用 tfe_workspacetfe_variable 资源通过 Terraform 提前创建它们。推荐使用后一种方法,因为它是程序化的,如果您需要轮换凭据,更新会更容易。

在这两种情况下,您都需要为 Terragrunt 调用的每个模块都有一个工作区。

另请参阅:this blog post 主题和 this content 与 Terragrunt 集成。

【讨论】:

  • 这是一个很好的答案,谢谢!这只是我们为 Terraform Enterprise 做的另一个好案例(我们已经有一些很好的理由,但这个成功了)。
  • 在短期内,您认为我不能对 terraform cloud 做同样的事情吗?在我的 CI 管道的 Docker 容器中运行 terragrunt 二进制文件,然后将输出打包并发送到 Terraform Cloud?还是在执行过程中没有任何意义可以完成?
  • 我不明白它是如何工作的。 TFC 是 Terraform 的执行平台,旨在在工作虚拟机上运行 Terraform。 Terragrunt plan-allapply-all 命令以特定顺序调用 Terraform,传入变量等。 TFC 工作节点需要能够执行 Terragrunt。例如,如果您先在本地 CI 中运行 terragrunt,则有点违背使用 TFC 的目的。
  • 我想您可以使用 TFC 进行状态存储,但可以在本地执行 (see here)。但是,您仍然无法利用 TFC 的一些主要优势。
  • 我已经用一些工作配置更新了答案,以便在本地使用 Terragrunt 并在 Terraform Cloud 中执行。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    如果这对任何人有帮助,我会将它放在 JasonPodgorny/terrastage 下的 github 上。

    【讨论】:

      猜你喜欢
      • 2021-05-27
      • 2018-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-02
      • 2019-12-31
      • 2021-12-08
      • 2022-12-19
      相关资源
      最近更新 更多