Terraform:在目录上循环以创建单个资源

Terraform:在目录上循环以创建单个资源,terraform,Terraform,我正在尝试使用Terraform()创建单个GCP工作流。为了创建工作流,我使用YAML中的工作流语法(也可以是JSON)定义了所需的步骤和执行顺序 我有大约20个不同的作业,每个作业都位于同一文件夹下不同的.yaml文件中,工作流/。我只想循环查看/workflows文件夹,并创建一个.yaml文件来创建我的资源。使用Terraform实现这一目标的最佳方式是什么?我读过关于每个_的,但它主要用于循环创建多个资源,而不是单个资源 工作流/job-1.yaml - getCurrentTime:

我正在尝试使用Terraform()创建单个GCP工作流。为了创建工作流,我使用YAML中的工作流语法(也可以是JSON)定义了所需的步骤和执行顺序

我有大约20个不同的作业,每个作业都位于同一文件夹下不同的
.yaml
文件中,
工作流/
。我只想循环查看
/workflows
文件夹,并创建一个
.yaml
文件来创建我的资源。使用Terraform实现这一目标的最佳方式是什么?我读过关于每个_的
但它主要用于循环创建多个资源,而不是单个资源

工作流/job-1.yaml

- getCurrentTime:
    call: http.get
    args:
        url: https://us-central1-workflowsample.cloudfunctions.net/datetime
    result: currentDateTime
- readWikipedia:
    call: http.get
    args:
        url: https://en.wikipedia.org/w/api.php
        query:
            action: opensearch
            search: ${currentDateTime.body.dayOfTheWeek}
    result: wikiResult
工作流/job-2.yaml

- getCurrentTime:
    call: http.get
    args:
        url: https://us-central1-workflowsample.cloudfunctions.net/datetime
    result: currentDateTime
- readWikipedia:
    call: http.get
    args:
        url: https://en.wikipedia.org/w/api.php
        query:
            action: opensearch
            search: ${currentDateTime.body.dayOfTheWeek}
    result: wikiResult
main.tf

resource "google_workflows_workflow" "example" {
  name          = "workflow"
  region        = "us-central1"
  description   = "Magic"
  service_account = google_service_account.test_account.id
  source_contents = YAML FILE HERE
Terraform有一个功能,允许配置对磁盘上可用的文件及其定义作出反应。您可以将此作为为每个构建合适表达式的起点:

locals {
  workflow_files = fileset("${path.module}/workflows", "*.yaml")
}
由于远程系统的设计,您似乎还需要为每个工作流指定一个单独的名称,因此您可能会决定将名称设置为与文件名相同,但删除
.yaml
后缀,如下所示:

locals {
  workflows = tomap({
    for fn in local.workflow_files :
    substr(fn, 0, length(fn)-5) => "${path.module}/workflows/${fn}"
  })
}
{
  job-1 = "./module/workflows/job-1.yaml"
  job-2 = "./module/workflows/job-2.yaml"
}
这使用将文件名集投影到从工作流名称(修剪的文件名)到特定文件路径的映射中。结果如下所示:

locals {
  workflows = tomap({
    for fn in local.workflow_files :
    substr(fn, 0, length(fn)-5) => "${path.module}/workflows/${fn}"
  })
}
{
  job-1 = "./module/workflows/job-1.yaml"
  job-2 = "./module/workflows/job-2.yaml"
}
这现在满足的要求,因此您可以直接将其称为每个表达式的

resource "google_workflows_workflow" "example" {
  for_each = local.workflows

  name            = each.key
  region          = "us-central1"
  description     = "Magic"
  service_account = google_service_account.test_account.id
  source_contents = file(each.value)
}

您的问题没有包含关于如何填充
description
参数的任何定义,因此我将其设置为硬编码
“Magic”
,如您的示例所示。为了用一些合理的东西填充它,你需要有一个额外的数据源,因为我上面写的已经充分利用了我们从目录内容扫描中获得的信息。

谢谢,我得到的
是“每个”对象没有一个名为“index”的属性。支持的属性是each.key和each.value,即“for_each”属性集的当前键和值对。
更改
${each.index}
使用
${count.index+1}
,它将起作用。