现有 Terraform 资源的模板参数模式

Pattern for templating arguments for existing Terraform resources

我正在使用 Terraform GitHub 提供程序为内部 GitHub 企业实例定义 GitHub 存储库(尽管问题不是特定于提供程序的)。

现有的 github_repository 资源工作正常,但我希望能够为其某些参数设置非标准默认值,并轻松地将其他参数分组到一个新参数下。

例如

案例还有很多,但这些说明了这一点。目的是让人们可以简单地正确配置新的存储库,并避免在每个存储库中重复大量配置。

我可以通过将变量传递到自定义模块中来实现这一点,例如类似于:

Foo/custom_repo/main.tf:

resource "github_repository" "custom_repo" {
  name                 = ${var.repo_name}
  private              = true
  allow_squash_merge   = true
  allow_merge_commit   = ${var.squash_merge_only ? false : true}
  allow_rebase_merge   = ${var.squash_merge_only ? false : true}
} 

Foo/main.tf:

provider "github" {
 ...
}

module "MyRepo_module" {
  source            = "./custom_repo"
  repo_name         = "MyRepo"
  squash_merge_only = true
}

虽然这有点垃圾,因为我必须为使用 custom_repo 模块的人可能想要设置的 github_repository 上的每个其他参数添加一个变量(基本上是所有参数- 我并不是想限制人们可以做什么)- 请参阅示例中的 namerepo_name。这一切都需要单独记录,这也是一种耻辱,因为现有提供者有很好的文档。

是否有更好的模式来重用像这样的现有资源,但对如何将参数传递给它们有一些控制?

我们在 https://github.com/mineiros-io/terraform-github-repository

为此创建了一个自以为是的模块 (terraform 0.12+)

我们将所有默认值设置为我们认为最合适的值,但基本上您可以创建一组本地默认值并在多次调用模块时重复使用它们。

有趣的事实......你想要的默认值已经是模块的默认值了,但为了清楚如何明确设置这些是一个例子(未经测试):

locals {
  my_defaults = {
     # actually already the modules default to create private repositories
     private = true

     # also the modules default already and 
     # all other strategies are disabled by default
     allow_squash_merge = true
  }
}


module "repository" {
  source  = "mineiros-io/repository/github"
  version = "0.4.0"

  name = "my_new_repository"

  defaults = local.my_defaults
}

并非所有参数都支持作为默认值,但大多数是:https://github.com/mineiros-io/terraform-github-repository#defaults-object-attributes