Terraform从用户列表生成密码:按组创建动态密钥对,同用户跨组密码不同
解决方案
1. 修正输入文件格式
首先修正users.yml中grp2的用户数组格式错误(原格式会被识别为单个用户字符串):
groups: - name: "grp1" path: "/grp1" description: "grp1 group" users: ["user1", "user2", "user3"] - name: "grp2" path: "/grp2" description: "grp2 group" users: ["user1", "user4"]
2. 动态生成用户-密码映射
通过random_password资源为每个组的每个用户生成独立密码(同一用户不同组密码不同),再通过本地值整理成目标格式:
修改locals.tf:
locals { # 解析YAML文件中的组信息 group_details = yamldecode(file(var.secrets_file)).groups # 整理基础组元数据 groups = { for group in local.group_details : group.name => { name = group.name path = group.path description = group.description users = group.users } } # 生成组-用户-密码的映射结构 grp_user_passwords = { for group_name, group in local.groups : group_name => { users = group.users psw = [for user in group.users : random_password.user_password["${group_name}_${user}"].result] } } } # 为每个组的每个用户生成独立随机密码 resource "random_password" "user_password" { for_each = { for group in local.group_details : "${group.name}_${user}" => user for user in group.users } length = 16 special = true override_special = "!@#$%^&*()" }
3. 更新Secrets Manager资源配置
修改secrets.tf,使用动态生成的密码数据构建Secret内容:
resource "aws_secretsmanager_secret" "sm" { for_each = local.groups name = each.value.path description = each.value.description tags = var.tags recovery_window_in_days = var.recovery_window_in_days } resource "aws_secretsmanager_secret_version" "sm-sv" { for_each = local.groups secret_id = aws_secretsmanager_secret.sm[each.key].id secret_string = jsonencode(zipmap(local.grp_user_passwords[each.key].users, local.grp_user_passwords[each.key].psw)) depends_on = [aws_secretsmanager_secret.sm] lifecycle { ignore_changes = [secret_string] } }
核心说明
random_password资源通过组名_用户名作为唯一标识,确保同一用户在不同组生成不同密码,且密码会被Terraform状态持久化,不会每次执行apply都变更。grp_user_passwords本地值自动生成了你需要的{组名: {users: [...], psw: [...]}}格式映射,无需硬编码。- 用
zipmap将用户数组和密码数组转为键值对,再JSON编码后存入Secrets Manager。
内容的提问来源于stack exchange,提问作者mg__
相关产品推荐
相关产品推荐

