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

Terraform for_each循环异常:AD组会员身份反复变更咨询

Terraform Active Directory Provider 组会员反复增减问题排查与解决

问题场景

使用Terraform Active Directory Provider创建用户、组及组会员,测试创建2个用户和2个组并将用户分配到组中,代码如下:

用户模块代码

resource "ad_user" "user1" {
  principal_name   = "user1"
  # 其他属性省略
}

output "user1_id" {
  value = ad_user.user1.id
}

组模块代码

resource "ad_group" "group1" {
  name             = "group1"
  # 其他属性省略
}

variable "group1" {}

output "group1_id" {
  value = ad_group.group1.id
}

resource "ad_group_membership" "group1" {
    for_each = toset(var.group1)
    group_id = ad_group.group1.id
    group_members = [ each.value ]
}

模块调用代码

module "groups" {
  source = ".//modules/groups"

  group1 =  [
    module.users.user1_id,
    module.users.user2_id
  ]
}

遇到的问题:首次执行terraform apply可正常创建并完成用户分配,但再次执行会显示移除会员分配,下一次apply又重新分配,如此反复循环。

原因分析

核心问题在于对ad_group_membership资源的误用:

  • 该资源的设计目标是管理整个AD组的会员集合,而非单个会员的添加/移除。
  • 当通过for_each为每个用户创建独立的ad_group_membership资源时,每个资源都会尝试将目标组的会员设置为仅包含自己对应的用户ID,导致多个资源的状态互相覆盖:
    1. 首次apply时,两个资源先后执行,后执行的资源会覆盖前一个的结果,最终组内仅保留最后一个用户;
    2. 后续执行terraform plan时,第一个资源会检测到组会员与自己的期望状态(仅包含user1)不符,计划将组会员改回[user1];
    3. 下一次apply后,第二个资源又会检测到状态不符,计划改回[user2],从而进入反复循环。

解决方法

1. 单资源管理整个组的会员集合

修改组模块中的ad_group_membership资源,移除for_each,直接传入完整的用户ID列表:

resource "ad_group_membership" "group1" {
  group_id       = ad_group.group1.id
  group_members  = var.group1
}

这样Terraform会通过单个资源维护组的会员状态,确保组内会员完全匹配var.group1中的列表,避免资源间的冲突覆盖。

2. 规范变量类型定义

在组模块中明确变量group1的类型为字符串列表,避免类型转换带来的潜在问题:

variable "group1" {
  type        = list(string)
  description = "用户ID列表,用于添加到group1组"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:03:34