You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Terraform中生成非Terraform管理的PagerDuty用户ID列表用于排班

解决方案

核心问题是你之前将for_each作用在了pagerduty_schedule资源上,才会生成和用户数量一致的多份排班表。只需移除排班表资源的for_each配置,通过Terraform表达式从用户数据源中批量提取ID生成列表传入即可。

步骤1:优化变量定义(可选但推荐)

把原来的map(any)改为更严谨的map(string),同时修正默认值里的笔误:

# variables.tf
variable "all_users" {
  description = "PagerDuty 用户邮箱映射,key 为自定义用户标识,value 为用户邮箱"
  type        = map(string)
  default     = { 
    user1 = "user1@test.com", 
    user2 = "user2@test.co.nz" 
  }
}

步骤2:用户数据源配置无需修改

你现有的users.tf配置是正确的,通过for_each批量拉取所有用户信息:

# users.tf
data "pagerduty_user" "users" {
  for_each = var.all_users
  email    = each.value
}

步骤3:修改排班表配置,批量传入用户ID

移除排班表资源的for_each,通过for表达式提取所有用户ID,同时可以通过排序保证用户顺序固定,避免不必要的配置变更:

# schedule.tf
resource "pagerduty_schedule" "schedule" {
  name      = "Rotation"
  time_zone = "Pacific/Auckland"

  layer {
    name                   = "On-Call"
    start                  = "2021-09-10T00:00:00-00:00"
    rotation_virtual_start = "2021-09-10T00:00:00-00:00"
    # 一周轮换
    rotation_turn_length_seconds = 604800
    # 按用户key排序保证排班顺序固定,如需自定义顺序可以调整变量为list类型按需求排序
    users = [for user_key in sort(keys(var.all_users)) : data.pagerduty_user.users[user_key].id]
  }
  teams = [pagerduty_team.team.id]
}

补充说明

如果需要更灵活的自定义排班顺序,可将变量改为列表类型:

variable "all_users" {
  description = "按排班顺序排列的用户邮箱列表"
  type        = list(string)
  default     = ["user1@test.com", "user2@test.co.nz"]
}

对应数据源修改为:

data "pagerduty_user" "users" {
  for_each = toset(var.all_users)
  email    = each.value
}

排班表的users参数直接按列表顺序提取:

users = [for email in var.all_users : data.pagerduty_user.users[email].id]

内容的提问来源于stack exchange,提问作者CJW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 10:57:02