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,导致多个资源的状态互相覆盖:- 首次apply时,两个资源先后执行,后执行的资源会覆盖前一个的结果,最终组内仅保留最后一个用户;
- 后续执行
terraform plan时,第一个资源会检测到组会员与自己的期望状态(仅包含user1)不符,计划将组会员改回[user1]; - 下一次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
相关产品推荐
相关产品推荐

