如何最好地处理使用通用 .tf 文件的多个 .tfvars 文件?

How best to handle multiple .tfvars files that use common .tf files?

我将通过 Terraform 管理数十个应用程序的 CDN 配置。我有一组 .tf 文件,其中包含所有配置中通用的所有默认常量设置,然后每个应用程序都有自己的 .tfvars 文件来保存其独特的设置。

如果我 运行 类似 terraform apply --var-file=app1.tfvars --var-file=app2.tfvars --var-file=app3.tfvars 的东西,那么只使用最后传入的文件。

即使这确实有效,当我将其扩展到更多站点时,它也会变得难以管理。

将多个 .tfvars 文件合并到一组通用 .tf 文件中的正确方法是什么?

编辑:我应该补充一点,.tfvar 文件定义了相同的变量但具有不同的值。我需要为每个 .tfvar 文件声明一次在 .tf 文件中定义的资源状态。

最好的方法可能是使用 GruntWork 的 TerraGrunt https://terragrunt.gruntwork.io/,它是 Terraform 的薄包装器,您可以使用 HCL 配置文件来定义您的要求。

示例 terragrunt.hcl 配置:

terraform {
  extra_arguments "conditional_vars" {
    commands = [
      "apply",
      "plan",
      "import",
      "push",
      "refresh"
    ]

    required_var_files = [
      "${get_parent_terragrunt_dir()}/terraform.tfvars"
    ]

    optional_var_files = [
      "${get_parent_terragrunt_dir()}/${get_env("TF_VAR_env", "dev")}.tfvars",
      "${get_parent_terragrunt_dir()}/${get_env("TF_VAR_region", "us-east-1")}.tfvars",
      "${get_terragrunt_dir()}/${get_env("TF_VAR_env", "dev")}.tfvars",
      "${get_terragrunt_dir()}/${get_env("TF_VAR_region", "us-east-1")}.tfvars"
    ]
  }

您可以传递 tfvar,也可以通过更好地组织 Terraform 布局从 terragrunt 获得更多功能,并使用配置文件从不同位置传递 tfvar。

我找到了处理这种情况的最佳方法(不使用任何第 3 方工具)Terraform 工作区并为每个 .tfvars 文件创建一个单独的工作区。这样我就可以使用相同的通用 .tf 文件,并在 运行 terraform apply --var-file=<filename> 之前简单地使用 terraform workspace select <workspace name> 与每个单独的 .tfvars 文件交换到不同的工作区。

这应该可以使用 process substitution:

terraform apply -var-file=<(cat app1.tfvars app2.tfvars app3.tfvars)