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