我有一个包含 Terraform Cloud 的配置管道,我们的领导层要求我们使用 Terragrunt 来提高 Terraform 代码质量。
Terragrunt 是一个很好的工具,但我没有看到任何证据表明有人在 Terraform Cloud 上成功使用了它。
任何人都可以解决这个问题吗?请只回答,如果你要么
- 自己做过,或者
- 可以提供文件证明这是可行的,或者
- 提供文件证明这不是一个好主意或
- Terraform Cloud 是不可能的。
我有一个包含 Terraform Cloud 的配置管道,我们的领导层要求我们使用 Terragrunt 来提高 Terraform 代码质量。
Terragrunt 是一个很好的工具,但我没有看到任何证据表明有人在 Terraform Cloud 上成功使用了它。
任何人都可以解决这个问题吗?请只回答,如果你要么
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 支持的环境变量。因此,作为inputs
Terragrunt 将变量传递给 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_workspace
和tfe_variable
资源通过 Terraform 提前创建它们。推荐使用后一种方法,因为它是程序化的,如果您需要轮换凭据,更新起来会容易得多。
在这两种情况下,您都需要为 Terragrunt 调用的每个模块提供一个工作区。
我收到了来自 Gruntwork 的 josh-padnick 的直接回复,他说目前还没有具体的计划来完成这项工作,并确认据他所知目前还无法工作。我感谢所有的答案!
真正阻止 terragrunt 与 tfcloud 中的 VCS 工作区交互相当容易的唯一事情是,它将所有文件暂存到 terragrunt 缓存,并在其中通过哈希运行目录名称以防止冲突。我们所做的是组合了一个辅助实用程序来帮助解决这个称为 terrastage 的用例。它使用 terragrunt 库,但不是使用散列名称将文件放入 terragrunt 缓存,而是让您可以控制要放置文件的位置,从而可以相当轻松地与 terraform cloud 的 VCS 工作区交互。您可以使用相同的方法使 terragrunt 真正与任何本机 terraform 工具一起工作。
如果这对任何人有帮助,我会将它放在 JasonPodgorny/terrastage 下的 github 上。