如何在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
相关产品推荐
相关产品推荐

