terraform-迭代两个链接的资源

terraform-迭代两个链接的资源,terraform,Terraform,我正在尝试编写一些代码,这些代码将采用如下输入结构: projects = { "project1" = { namespaces = ["mynamespace1"] }, "project2" = { namespaces = ["mynamespace2", "mynamespace3"] } } 并为每个资源提供多个资源,

我正在尝试编写一些代码,这些代码将采用如下输入结构:

  projects = {
    "project1" = {
      namespaces = ["mynamespace1"]
     },
    "project2" = {
      namespaces = ["mynamespace2", "mynamespace3"]
    }
  }
并为每个资源提供多个资源,这将导致:

resource "rancher2_project" "project1" {
  provider   = rancher2.admin
  cluster_id = module.k8s_cluster.cluster_id

  wait_for_cluster = true
}

resource "rancher2_project" "project2" {
  provider   = rancher2.admin
  cluster_id = module.k8s_cluster.cluster_id

  wait_for_cluster = true
}

resource "rancher2_namespace" "mynamespace1" {
  provider    = rancher2.admin
    project_id  = rancher2_project.project1.id
   
  depends_on = [rancher2_project.project1]
}

resource "rancher2_namespace" "mynamespace2" {
  provider    = rancher2.admin
    project_id  = rancher2_project.project2.id
   
  depends_on = [rancher2_project.project2]
}

resource "rancher2_namespace" "mynamespace3" {
  provider    = rancher2.admin
    project_id  = rancher2_project.project2.id
   
  depends_on = [rancher2_project.project2]
}
命名空间依赖于项目,需要将generate id传递到命名空间中

有没有什么好的方法可以动态地做到这一点?我们可能有很多项目/名称空间


感谢您的帮助和建议。

基于数据结构系统地生成资源的多个实例的典型答案是。每个的资源
的主要要求是,每个要创建的资源实例都有一个包含一个元素的映射

在您的案例中,似乎每个项目需要一个
rancher2_项目
,然后每对项目和名称空间需要一个
rancher2_名称空间
。因此,您当前的数据结构已经足够用于
rancher2\u项目
资源:

resource "rancher2_project" "example" {
  for_each = var.projects
  provider = rancher2.admin

  cluster_id       = module.k8s_cluster.cluster_id
  wait_for_cluster = true
}
上面将声明两个具有以下地址的资源实例:

  • rancher2\u项目。示例[“项目1”]
  • rancher2\u项目。示例[“项目2”]
您当前没有一个每个名称空间都有一个元素的映射,因此需要做更多的工作才能从输入数据结构中派生出合适的值。这种情况的常见模式是使用:

这将生成一个表示所有项目和命名空间对的对象列表,然后
for_each
参数使用包含项目键和命名空间键的复合键将其转换为映射,以确保它们都是唯一的。因此,生成的实例将具有以下地址:

  • rancher2\u名称空间。示例[“project1.mynamespace1”]
  • rancher2\u名称空间。示例[“project2.mynamespace2”]
  • rancher2\u名称空间。示例[“project2.mynamespace3”]

    • 这似乎也起作用:

      resource "rancher2_namespace" "example" {
        count      = length(local.project_namespaces)
        provider   = rancher2.admin
        name       = local.project_namespaces[count.index].namespace_name
        project_id = local.project_namespaces[count.index].project_id
      }
      

      您的示例不是迭代2个提供程序配置,而是迭代使用相同提供程序但不同项目的2个资源。您的示例中是否遗漏了一些内容?我的错误应该超过2个参考资料。非常感谢您的详细解释,我查看了扁平化函数,但不了解如何在命名空间资源中使用它。一对一对。。(0-0)我可以使用count和类似的东西来创建名称空间:local.project\u namespaces[count.index].namespace\u name,这样您就不需要再进行从列表到映射的转换。你怎么认为?
      resource "rancher2_namespace" "example" {
        count      = length(local.project_namespaces)
        provider   = rancher2.admin
        name       = local.project_namespaces[count.index].namespace_name
        project_id = local.project_namespaces[count.index].project_id
      }