使用变量在 Terraform 中配置和创建新的 Github 存储库实例而不是就地更新的最佳实践

Best practice for using variables to configure and create new Github repository instance in Terraform instead of updating-in-place

我正在尝试为我的组织设置一个标准的 Github 存储库模板,该模板使用 Terraform 通过配置的设置启动新的存储库。

每次我尝试更新配置文件以使用新名称创建存储库的新实例时,它都会尝试就地更新已使用该文件创建的任何存储库。

我的问题是,使我的配置文件可与存储库名称等输入变量一起重用的最佳做法是什么?我应该制作一个模块还是有其他方法可以重用该文件?

感谢您的帮助。

Terraform 是一个理想状态配置系统,这意味着您的配置应该代表应该存在的完整对象集,而不是创建单个对象的指令。

因此,添加新存储库的典型方法是添加一个新的 resource 块声明该新存储库,并保持现有存储库不变。然后,Terraform 会看到该状态下有一个当前未跟踪的新资源,并建议创建它。

如果您的存储库是以某种系统的方式配置的,您可以使用机械规则而不是手动配置来描述,那么您可以使用 the for_each meta-argument 使用 Terraform 语言从同一资源块声明多个资源实例描述系统规则的表达式。

例如,您可以创建一个具有更高级别数据结构的本地值,该数据结构描述了您的存储库之间应该有什么不同,然后在单个 resource 上将该数据结构与 for_each 一起使用区块:

locals {
  repositories = tomap({
    example_1 = {
      description = "First example repository"
    }
    example_2 = {
      description = "Second example repository"
    }
  })
}

resource "github_repository" "all" {
  for_each = local.repositories

  name        = each.key
  description = each.value.description
  private     = true
}

为了简单起见,在这个例子中我只在实例之间创建了名称和描述变量,但是你可以为 local.repositories 的每个元素添加你需要的任何额外属性,然后通过 each.valueresource 块内。

上面的 private 参数说明了这种方法如何避免重新声明参数值的需要,这些参数值对于每个声明的存储库都是相同的,并且让您的 local.repositories 数据结构只关注描述围绕 GitHub 个存储库的本地策略所需的变化所需的最少属性。

带有 for_each 集的 resource 块在其他地方的表达式中使用时显示为对象映射,使用与 for_each 中给出的映射相同的键。因此,如果您需要访问存储库 ID 或系统声明的对象的任何其他属性,您可以编写与地图一起使用的 Terraform 表达式。例如,如果您想将所有存储库 ID 输出为字符串映射:

output "repository_ids" {
  value = tomap({
    for k, r in github_repository.all : k => r.repo_id
  })
}