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

如何使用Terraform批量创建Azure AD用户,解决for_each参数报错问题

问题根因

报错是因为Terraform的for_each参数仅支持map或字符串集合类型作为入参,你当前定义的local.users是嵌套元组(列表)类型,不符合参数要求。使用map结构作为for_each入参还有额外优势:后续用户列表发生增减时,Terraform仅会针对变动的用户执行增删操作,不会误改其他未变动的用户资源,稳定性远高于count参数。

解决方案

这里提供两种可行方案,推荐第一种,适配性和可读性更高:

方案1:调整local.users为map结构(推荐)

直接将原来的嵌套列表改造为以用户名为key的map结构,属性语义更清晰,后续对接JSON配置也更方便:

locals {
  users = {
    user1 = {
      display_name = "Example User1"
      password     = "Password@1234#"
    }
    user2 = {
      display_name = "Example User2"
      password     = "Password@09876#"
    }
  }
}

对应的azuread_user资源代码调整如下:

resource "azuread_user" "test" {
  for_each = local.users

  user_principal_name = "${each.key}@tenantname.OnMicrosoft.com"
  display_name        = each.value.display_name
  mail_nickname       = each.key
  password            = each.value.password
}

方案2:不改动现有locals结构,就地转换为map

如果不想修改现有嵌套列表的写法,可以直接通过表达式将列表转换为索引为key的map:

resource "azuread_user" "test" {
  # 将嵌套元组转换为符合for_each要求的map结构
  for_each = { for index, user in local.users : index => user }

  user_principal_name = "${each.value[0]}@tenantname.OnMicrosoft.com"
  display_name        = each.value[1]
  mail_nickname       = each.value[0]
  password            = each.value[2]
}

注意该方案存在局限性:如果后续调整了local.users中的用户排列顺序,索引变化会触发对应位置的用户重建,因此仅适合临时测试使用。

额外提示
  • 生产环境不要明文存储密码,建议通过Terraform敏感变量、Azure Key Vault等方式存储敏感信息,避免密码泄露。
  • 后续从JSON文件加载配置时,可以直接用jsondecode(file("users.json"))加载为map结构,和方案1的写法完全兼容,仅需少量修改即可完成对接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:57:00