我可以在 Terraform Cloud 上使用 Terragrunt 吗?
Can I use Terragrunt on Terraform Cloud
我有一个包含 Terraform Cloud 的配置管道,我们的领导要求我们使用 Terragrunt 来提高 Terraform 代码质量。
Terragrunt 是一个很好的工具,但我没有看到任何证据表明有人已经在 Terraform Cloud 上成功使用它。
谁能解决这个问题?请只回答如果你
- 自己做过,或者
- 可以提供可行的文件,或者
- 提供证明这不是一个好主意的文件或
- 无法使用 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。
我有一个包含 Terraform Cloud 的配置管道,我们的领导要求我们使用 Terragrunt 来提高 Terraform 代码质量。
Terragrunt 是一个很好的工具,但我没有看到任何证据表明有人已经在 Terraform Cloud 上成功使用它。
谁能解决这个问题?请只回答如果你
- 自己做过,或者
- 可以提供可行的文件,或者
- 提供证明这不是一个好主意的文件或
- 无法使用 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。