我正在尝试使用 Terraform 管理 200 多个组织的 GitHub Enterprise。这是我到目前为止所取得的成就:
我使用 Terraform 中的 GitHub 提供程序 (
integrations/github
) 通过创建自定义组织模块来创建/修改 10 多个组织。
我构建的模块如下:
variable "team-configuration" {
description = "Define the GitHub Teams organization configuration."
type = map(object({
entraid-group-name = string
gh-team-name = string
gh-team-description = optional(string, null)
gh-team-privacy = optional(string, "secret")
gh-team-parent_id = optional(string, null)
gh-team-ldap-dn = optional(string, null)
}))
}
entraid-group-name
,因为每个键都有不同的值:locals {
## Following local will iterate with the value entered in variable -> `team-configuration` and get the value entered to `entraid-group-name`.
target_groups = {
for k, v in var.team-configuration : k => {
group_id = [for g in data.github_external_groups.idp-groups.external_groups : g.group_id if g.group_name == v.entraid-group-name][0]
}
}
}
这确保了以下数据块中的数据得到验证:
data "github_external_groups" "idp-groups" {}
然后它将应用于以下资源映射:
resource "github_emu_group_mapping" "map-team-with-idp" {
for_each = var.team-configuration
team_slug = github_team.org-teams[each.key].slug
group_id = local.target_groups[each.key].group_id
}
随后创建 github 团队:
resource "github_team" "org-teams" {
for_each = var.team-configuration
name = each.value.gh-team-name
description = each.value.gh-team-description
privacy = each.value.gh-team-privacy
}
这就是模块的完成及其工作原理
---
调用模块:
module "gh-teams" {
source = "../modules/gh_teams"
team-configuration = var.team-configuration
}
最终将成功构建模块。
# module.gh-teams.github_emu_group_mapping.map-team-with-idp["this"] will be created
+ resource "github_emu_group_mapping" "map-team-with-idp" {
+ etag = (known after apply)
+ group_id = 1234
+ id = (known after apply)
+ team_slug = (known after apply)
}
# module.gh-teams.github_team.org-teams["this"] will be created
+ resource "github_team" "org-teams" {
+ create_default_maintainer = false
+ etag = (known after apply)
+ id = (known after apply)
+ members_count = (known after apply)
+ name = "xyz"
+ node_id = (known after apply)
+ privacy = "secret"
+ slug = (known after apply)
}
Plan: 2 to add, 0 to change, 0 to destroy.
当我在
provider
中指向以下组织时:
provider "github" {
token = var.GITHUB_TOKEN
owner = "x-org"
}
---
需要帮助:
我想以尽可能流畅的方式和尽可能单一的状态文件在多个 GitHub 组织中配置团队。
alias
方法,但似乎不太可行,因为我必须创建更多模块。provider "github" {
token = var.GITHUB_TOKEN
alias = "this"
owner = "x-org"
}
for_each
,但两者都返回了错误。 The provider argument name "for_each" is reserved for use by Terraform/OpenTofu in a future version.
provider "github" {
for_each = toset(var.orgs)
token = var.GITHUB_TOKEN
owner = each.key
}
另请注意,Tofu 不承认我的代币为组织。
有什么建议吗?这样我就可以将 GitHub 组织团队配置给特定组织,而无需所有组织都应用相同的配置?
我可以在这里建议四个选项 - 第一个,使用 TF stack,正如 Rui Jarimba 在评论中提到的那样。
第二个 - 对不同的项目使用不同的 git 分支。缺点是它可能难以管理,您需要一些自动化,并且 terraform 模块应该在主存储库之外进行管理。但这里的优点是,您将拥有完全独立的项目 - 一个分支中的错误不会影响其他分支。
第三个是使用Terragrunt。借助 Terragrunt,您可以使用单个分支组织项目的扁平结构。它只是一个分支,并且它应该比分支策略更容易使用。我认为唯一的缺点是 Terragrunt 又多了一种工具,它带来了多一层障碍,也是你应该学习的又一种工具。
您还可以检查Terraform Workspaces,但我认为它不适合这里,据我了解,它更适合少量项目。