Terraform 如何在同一个列表上迭代多个资源?
这里的地形是新的。我正在尝试使用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) 如果我想创建一个单独的项目,这是可
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
}
希望这有帮助!如果你认为答案是好的并且有效,为什么不投更多的票而不是在评论中说谢谢呢?