1

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

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

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

谢谢您的帮助。

4

1 回答 1

0

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

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

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

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

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.value内部访问它们resource

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

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

output "repository_ids" {
  value = tomap({
    for k, r in github_repository.all : k => r.repo_id
  })
}
于 2021-07-06T18:50:32.920 回答