如何通过遍历CSV在Terraform中为Azure AD组分配成员
问题
使用Terraform的azuread_group_member、azuread_group、azuread_user资源创建Azure AD组后,需要根据用户CSV中的部门关联关系,将用户分配到对应组中。现有文件及代码如下:
用户CSV(users.csv)
first_name,last_name,department UserName1,LastName1,Department1 UserName2,LastName2,Department2
组CSV(aad_groups.csv)
department_name Department1 Department2
已实现的代码
读取CSV的本地变量:
locals { users = csvdecode(file("${path.module}/users.csv")) groups = csvdecode(file("${path.module}/aad_groups.csv")) }
创建用户资源:
# Create users resource "azuread_user" "users" { for_each = { for user in local.users : user.first_name => user } user_principal_name = format( "%s@%s", each.value.employee_id, # 注意:users.csv中无employee_id列,需调整为现有字段如first_name "mydomain.com" ) }
创建组资源:
# Create groups resource resource "azuread_group" "groups" { for_each = { for group in local.groups : group.department_name => group } display_name = each.value.department_name security_enabled = true }
解决方案
要实现用户按部门分配到对应组,需先构建部门与用户的映射关系,再通过azuread_group_member资源关联组和用户:
1. 新增按部门分组的本地变量
在locals中添加一个映射,将部门名称作为键,对应部门的用户列表作为值:
locals { users = csvdecode(file("${path.module}/users.csv")) groups = csvdecode(file("${path.module}/aad_groups.csv")) # 按部门分组的用户映射 users_by_department = { for user in local.users : user.department => concat(try(local.users_by_department[user.department], []), [user]) } }
2. 创建组成员关联资源
使用嵌套遍历,遍历每个组及对应部门的用户,生成唯一的资源标识,再关联组和用户的对象ID:
# 为组分配成员 resource "azuread_group_member" "group_members" { # 生成唯一的资源键:组名-用户名 for_each = { for group in local.groups : for user in local.users_by_department[group.department_name] : "${group.department_name}-${user.first_name}" => { group_name = group.department_name user_first_name = user.first_name } } # 关联组的对象ID group_object_id = azuread_group.groups[each.value.group_name].object_id # 关联用户的对象ID member_object_id = azuread_user.users[each.value.user_first_name].object_id }
注意事项
- 原
azuread_user资源中的employee_id字段在users.csv中不存在,需修改为CSV中已有的字段(如first_name或last_name),否则会导致Terraform报错,例如:user_principal_name = format( "%s.%s@%s", each.value.first_name, each.value.last_name, "mydomain.com" ) - 确保每个用户的
first_name唯一,因为当前azuread_user资源使用first_name作为for_each的键,若有重名用户需改用唯一标识(如邮箱前缀或自定义ID)。
内容的提问来源于stack exchange,提问作者JoelCanteroGCO
相关产品推荐
相关产品推荐

