0

我正在尝试从头开始创建 Gitlab 组的层次结构。由于它可能会自行扩展,因此我不想为每个组创建单独的资源,因此我尝试创建一个自定义模块并通过使用 for_each 从列表中创建组:

module "gitlab_groups" {
  for_each = local.groups
  source = "./modules/group"
  name = each.value.name path = each.value.path parent_group = try(each.value.parent_group, null) 
}

在所有组都没有父组之前,这很有效。问题是如果提供了父组,它将在创建父组之前读取父组的数据。

模块中的相关代码片段:

data "gitlab_group" "parent" {
  count = var.parent_group == null ? 0 : 1
  full_path = var.parent_group 
}

resource "gitlab_group" "group" {
  name = var.name
  path = var.path
  parent_id = var.parent_group == null ? null : data.gitlab_group.parent[0].group_id 
}

terraform apply命令记录:

module.gitlab_groups[1].data.gitlab_group.parent[0]: Reading...
module.gitlab_groups[0].gitlab_group.group: Creating...
module.gitlab_groups[0].gitlab_group.group: Creation complete after 1s [id=56]

depends_on除了为每个组创建单独的资源并手动设置之外,还有什么方法可以强制依赖列表中的另一个元素?

如果有必要,我正在使用以下版本:

> terraform --version
Terraform v1.0.0
on windows_amd64
+ provider registry.terraform.io/gitlabhq/gitlab v3.6.0

任何帮助表示赞赏!

编辑:最初的想法是创建一个动态组层次结构,我们不必手动将子组重新连接到新的中间父级。 示例图像

如果我想在 Subgroup2 及其子组之间引入一个新组,我将不得不手动设置彼此之间的依赖关系,虽然这对少数组来说不是问题,但如果足够大,这可能是一个真正的问题组数。

4

1 回答 1

0

Terraform 中的依赖关系位于声明块( theresourcedata块)之间,而不是在评估它们产生的实例之间,因为countandfor_each参数本身受依赖关系的影响。出于这个原因,我认为您在这里描述的问题不太适合您尝试的模块设计,而且我认为resource "github_group"直接编写块并使用普通的 Terraform 引用将它们连接在一起会更好。

因为资源的多个实例在概念上都是在 Terraform 中同时处理的,尽管实际上 Terraform 限制了它的并发性,因此结果通常是操作以某种未定义的顺序完成。

如果您需要特定的操作顺序,则需要声明两个独立的资源,它们之间存在依赖关系。但是,您不需要使用depends_on,因为每个子对象无论如何都会引用其父对象的 id。

我看到的关于您的配置的另一件事是,您似乎正在尝试管理一个组并使用同一配置中的数据源检索该组。这是一个非常棘手的模式,因为您需要向 Terraform 解释它不应该在创建或更新对象之前尝试读取它。相反,最佳实践是使用上游资源对象本身来填充下游资源,这样下游对象将直接引用上游对象,因此依赖关系图将自动正确。

于 2021-06-28T15:30:57.997 回答