16

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

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

任何人都可以解决这个问题吗?请只回答,如果你要么

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

3 回答 3

25

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

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

要进行设置,首先您需要获取 API 令牌使用credentials.terraformrc.

接下来,您需要生成一个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
}

此代码会生成一个backend.tf与 Terraform 模块一起调用的文件。这指示 Terraform 使用 TFC 作为远程后端。它将使用名为your-workspace. 如果此工作区不存在,TFC 将使用隐式工作区创建自动创建它。您在 Terragrunt 中调用的每个模块都将拥有一个工作区。

TFC 不支持TF_VAR_*“stock”Terraform 支持的环境变量。因此,作为inputsTerragrunt 将变量传递给 Terraform 的标准方式的 Terragrunt 块不起作用。

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

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

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

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

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

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

另请参阅:有关该主题的博客文章和有关与 Terragrunt 集成的内容。

于 2020-02-04T22:35:53.500 回答
1

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

于 2020-05-20T18:07:08.780 回答
1

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

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

于 2021-01-31T16:37:45.097 回答