带嵌套列表的地形动态块

时间:2020-02-14 13:00:12

标签: terraform

我需要使用Terraform在Pagerduty中创建升级策略。我想动态创建rule块,然后在其中创建target块,并使用rule中的值。我不确定如何在目标块内进行第二次调用以使其动态化。 我在列表中有一个团队列表。

locals {
  teams = [
    [data.pagerduty_schedule.ce_ooh_schedule.id, data.pagerduty_schedule.pi_office_hours_schedule.id],
    [data.pagerduty_schedule.delivery_managers_schedule.id]
  ]
}

resource "pagerduty_escalation_policy" "policy" {

    name = var.policy_name
    num_loops = var.num_loops
    teams = [var.policy_teams]

    dynamic "rule" {
      for_each = local.teams
      escalation_delay_in_minutes = var.escalation_delay
      dynamic "target" {
         for_each = ??????
         content {
            type = var.target_type
            id = ??????
         }
       }
    }
}

???是我不确定的要点。

我需要为列表中的每个项目创建一个规则(因此[team1,team2]和[escalation_team]),然后为那些列表中的每个项目创建一个目标,每个团队都需要一个目标(因此规则1将有两个目标-team1和team2,规则2将有一个目标是escalation_team)。

有什么办法可以解决这个问题吗?

我正在使用TF v0.12.20

这是更新后的配置:

resource "pagerduty_escalation_policy" "policy" {
name      = var.policy_name
  num_loops = var.num_loops
  teams     = [var.policy_teams]

  dynamic "rule" {
    for_each = local.teams
    escalation_delay_in_minutes = var.escalation_delay

    dynamic "target" {
      for_each = rule.value
      content {
        type = var.target_type
        id   = target.value
      }
    }
  }
}

编辑:将locals.teams更改为local.teams

1 个答案:

答案 0 :(得分:2)

如果我正确阅读了您的问题,那么我相信您想要以下类似内容

resource "pagerduty_escalation_policy" "policy" {
  name      = var.policy_name
  num_loops = var.num_loops
  teams     = [var.policy_teams]

  dynamic "rule" {
    for_each = locals.teams
    content {
      escalation_delay_in_minutes = var.escalation_delay

      dynamic "target" {
        for_each = rule.value
        content {
          type = var.target_type
          id   = target.value
        }
      }
    }
  }
}

请注意以下内容

  • 每个dynamic块必须有一个匹配的content
  • dynamic块引入了具有.key.value的新名称,可用于访问正在循环的内容的属性。

我实际上不能运行它,所以如果仍然出错,请告诉我,我会进行更新。