Terraform 如何在同一个列表上迭代多个资源?

Terraform 如何在同一个列表上迭代多个资源?,terraform,terraform-provider-gcp,Terraform,Terraform Provider Gcp,这里的地形是新的。我正在尝试使用Terraform创建多个项目(在谷歌云中)。问题是我必须执行多个资源才能完全设置一个项目。我尝试了count,但如何使用count按顺序绑定多个资源?以下是每个项目需要执行的以下资源: 使用资源“google\u项目”创建项目 使用资源“谷歌项目服务”启用API服务 使用资源“google\u compute\u shared\u vpc\u service\u project”将服务项目附加到主机项目(我使用的是共享vpc) 如果我想创建一个单独的项目,这是可

这里的地形是新的。我正在尝试使用Terraform创建多个项目(在谷歌云中)。问题是我必须执行多个资源才能完全设置一个项目。我尝试了
count
,但如何使用
count
按顺序绑定多个资源?以下是每个项目需要执行的以下资源:

  • 使用
    资源“google\u项目”创建项目
  • 使用
    资源“谷歌项目服务”启用API服务
  • 使用
    资源“google\u compute\u shared\u vpc\u service\u project”
    将服务项目附加到主机项目(我使用的是共享vpc)
  • 如果我想创建一个单独的项目,这是可行的。但是,如果我传递一个项目列表作为输入,我如何依次执行该列表中每个项目的所有上述资源

    例如

    输入

    project_list=["proj-1","proj-2"]
    
    按顺序执行以下操作:

    resource "google-project" for "proj-1"
    resource "google_project_service" for "proj-1"
    resource "google_compute_shared_vpc_service_project" for "proj-1"
    
    resource "google-project" for "proj-2"
    resource "google_project_service" for "proj-2"
    resource "google_compute_shared_vpc_service_project" for "proj-2"
    
    

    我正在使用Terraform版本0.11,它不支持Terraform中循环的
    ,,您可以使用
    计数和两个插值函数
    元素()
    长度()

    首先,您将为模块提供一个输入变量:

    变量“项目列表”{
    type=“列表”
    }
    
    然后,您将得到如下内容:

    资源“google\u项目”{
    count=“${length(var.project_list)}”
    name=“${element(var.project\u list,count.index)}”
    }
    资源“谷歌项目服务”{
    count=“${length(var.project_list)}”
    name=“${element(var.project\u list,count.index)}”
    }
    资源“谷歌计算共享专有网络服务项目”{
    count=“${length(var.project_list)}”
    name=“${element(var.project\u list,count.index)}”
    }
    
    当然,在这些资源声明中也会有其他配置


    请注意,第5章中描述了此模式,并且还有在文档中使用
    count.index
    的其他示例。

    此问题/答案的一个小更新(terraform 0.13及更高版本)。由于terraforms的工作方式,不建议再使用计数或长度,让我们想象下一个场景:

    假设您有一个包含3个元素的数组:
    project\u list=[“proj-1”、“proj-2”、“proj-3”]
    ,一旦应用该元素,如果您希望在运行计划后从数组中删除
    “proj-2”
    项,terraform将把第二个元素修改为
    “proj-3”
    ,而不是将其从列表中删除。获得正确行为的解决方案是使用以下函数:

    variable "project_list" {
      type = list(string)
    }
    
    resource "google_project" {
      for_each = toset(var.project_list)
      name  = each.value
    }
    
    resource "google_project_service" {
      for_each = toset(var.project_list)
      name  = each.value
    }
    
    resource "google_compute_shared_vpc_service_project" {
      for_each = toset(var.project_list)
      name  = each.value
    }
    

    希望这有帮助!如果你认为答案是好的并且有效,为什么不投更多的票而不是在评论中说谢谢呢?