Terraform - GitHub 提供商 |管理组织的可扩展方法

问题描述 投票:0回答:1

我正在尝试使用 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"
}
  • 我尝试在 Terraform 和 Tofu 的提供程序中使用
    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 组织团队配置给特定组织,而无需所有组织都应用相同的配置?

github terraform infrastructure-as-code github-organizations terraform-provider-github
1个回答
0
投票

我可以在这里建议四个选项 - 第一个,使用 TF stack,正如 Rui Jarimba 在评论中提到的那样。

第二个 - 对不同的项目使用不同的 git 分支。缺点是它可能难以管理,您需要一些自动化,并且 terraform 模块应该在主存储库之外进行管理。但这里的优点是,您将拥有完全独立的项目 - 一个分支中的错误不会影响其他分支。

第三个是使用Terragrunt。借助 Terragrunt,您可以使用单个分支组织项目的扁平结构。它只是一个分支,并且它应该比分支策略更容易使用。我认为唯一的缺点是 Terragrunt 又多了一种工具,它带来了多一层障碍,也是你应该学习的又一种工具。

您还可以检查Terraform Workspaces,但我认为它不适合这里,据我了解,它更适合少量项目。

© www.soinside.com 2019 - 2024. All rights reserved.