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_ID 和 AWS_SECRET_ACCESS_KEY)。您可以通过创建provider.tf 文件在提供程序配置中定义它,但是凭据是静态的并且是纯文本的。不好。
相反,您可以手动设置每个工作区中的环境变量,也可以使用 tfe_workspace 和 tfe_variable 资源通过 Terraform 提前创建它们。推荐使用后一种方法,因为它是程序化的,如果您需要轮换凭据,更新会更容易。
在这两种情况下,您都需要为 Terragrunt 调用的每个模块都有一个工作区。
另请参阅:this blog post 主题和 this content 与 Terragrunt 集成。