3

此处是 Terraform 的新手。我正在尝试使用 Terraform 创建多个项目(在 Google Cloud 中)。问题是我必须执行多个资源才能完全建立一个项目。我试过count了,但我怎样才能按顺序使用多个资源count?以下是我需要为每个项目执行的以下资源:

  1. 使用创建项目resource "google_project"
  2. 使用启用 API 服务resource "google_project_service"
  3. resource "google_compute_shared_vpc_service_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"

我正在使用不支持for循环的 Terraform 0.11 版

4

2 回答 2

1

在 Terraform 中,您可以使用count和 两个插值函数element()length().

首先,你会给你的模块一个输入变量:

variable "project_list" {
  type = "list"
}

然后,你会有类似的东西:

resource "google_project" {
  count = "${length(var.project_list)}"
  name  = "${element(var.project_list, count.index)}"
}

resource "google_project_service" {
  count = "${length(var.project_list)}"
  name  = "${element(var.project_list, count.index)}"
}

resource "google_compute_shared_vpc_service_project" {
  count = "${length(var.project_list)}"
  name  = "${element(var.project_list, count.index)}"
}

当然,您在这些资源声明中也会有其他配置。

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

于 2019-05-15T09:55:08.753 回答
0

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

假设您有一个包含 3 个元素的数组:project_list=["proj-1","proj-2","proj-3"],一旦您应用它,如果您想在"proj-2"运行计划后从数组中删除该项目,terraform 会将您的第二个元素修改为"proj-3"而不是从列表中删除它(更多信息在这个好帖子)。获得正确行为的解决方案是使用for_each函数,如下所示:

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
}

希望这可以帮助!

于 2021-02-25T15:26:05.870 回答