在Terraform中反转YAML节点关联生成成员-组映射是否可行?
实现成员与所属组的映射转换
问题描述
假设有如下YAML输入文件:
admins: members: - john@gmail.com - peter@gmail.com viewers: members: - maria@gmail.com - john@gmail.com
该文件通过yamldecode解析后存入变量var.memberships,需要将其转换为以成员邮箱为键、对应所属组列表为值的结构,目标示例如下:
{ "maria@gmail.com" = { groups = ["viewers"] }, "john@gmail.com" = { groups = ["admins", "viewers"] }, "peter@gmail.com" = { groups = ["admins"] } }
解决方案
可以通过Terraform的for表达式结合merge函数实现该转换,具体代码如下:
1. 变量定义
首先定义存储解析后数据的变量:
variable "memberships" { type = map(object({ members = list(string) })) description = "解析后的成员分组数据" }
2. 转换逻辑
通过locals块实现转换:
locals { member_groups = merge([ for group_name, group_data in var.memberships : { for member in group_data.members : member => { groups = concat( lookup(local.member_groups, member, { groups = [] }).groups, [group_name] ) } } ]...) }
3. 验证输出
可以通过output块查看转换结果:
output "member_groups" { value = local.member_groups }
代码说明
- 外层
for循环遍历每个组(admins、viewers),获取组名和对应的成员列表 - 内层
for循环遍历当前组的每个成员,为成员构建包含所属组的对象 - 使用
merge函数将所有成员的分组信息合并为一个完整的映射,自动处理同一成员属于多个组的情况,将组名追加到groups列表中
内容的提问来源于stack exchange,提问作者pkaramol
相关产品推荐
相关产品推荐

