首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在同一个列表上迭代多个资源?

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

Stack Overflow用户
提问于 2019-05-14 19:13:34
回答 2查看 2.2K关注 0票数 3

这里刚到Terraform。我正在尝试使用Terraform创建多个项目(在Google中)。问题是我必须执行多个资源来完全设置一个项目。我尝试了count,但是如何使用count顺序绑定多个资源?以下是每个项目执行所需的以下资源:

  1. 使用resource "google_project"创建项目
  2. 使用resource "google_project_service"启用API服务
  3. 使用resource "google_compute_shared_vpc_service_project"将服务项目附加到主机项目(我使用的是共享VPC)

如果我想要创建一个单独的项目,这是可行的。但是,如果我将项目列表作为输入传递,那么如何顺序执行列表中每个项目的所有上述资源?

例如:

输入

代码语言:javascript
复制
project_list=["proj-1","proj-2"]

按顺序执行以下操作:

代码语言:javascript
复制
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"

我使用的是TerraformVersion0.11,它不支持for循环

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-15 09:55:08

在Terraform中,您可以使用count和两个插值函数element()length()来实现这一点。

首先,您将给模块一个输入变量:

代码语言:javascript
复制
variable "project_list" {
  type = "list"
}

然后,你会得到这样的东西:

代码语言:javascript
复制
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启动和运行第5章中进行了描述,还有在docs 这里中使用count.index的其他示例。

票数 1
EN

Stack Overflow用户

发布于 2021-02-25 15:26:05

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

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

代码语言:javascript
复制
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
}

希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56137102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档