求助:在Ansible中从大型JSON变量提取组与用户ID映射数据
Ansible提取AD组ID与成员ID映射的解决方案
针对你提供的JSON结构,这里有两种高效的方法可以提取Group_ID到对应成员User_ID列表的映射:
方法一:使用json_query(推荐,适合大型数据集)
利用JMESPath查询语法直接提取并转换结构,一步到位:
- name: 生成组ID到成员ID的映射 set_fact: group_member_map: "{{ ad_tenant_data.ad_groups | json_query('[].{key: Group_ID, value: group_members[].User_ID}') | items2dict }}"
逻辑说明:
json_query('[].{key: Group_ID, value: group_members[].User_ID}'):遍历所有组,将每个组转换为包含key(组ID)和value(成员ID列表)的字典items2dict:将这些小字典合并成一个完整的映射集合
方法二:使用循环+combine(适合需要额外处理的场景)
如果需要在构建映射时添加额外逻辑,可以用循环逐步合并:
- name: 初始化空映射 set_fact: group_member_map: {} - name: 遍历每个组构建映射 set_fact: group_member_map: "{{ group_member_map | combine({ item.Group_ID: item.group_members | map(attribute='User_ID') | list }) }}" loop: "{{ ad_tenant_data.ad_groups }}"
逻辑说明:
- 先初始化一个空字典作为映射容器
- 循环每个AD组,用
map(attribute='User_ID')提取当前组所有成员的ID并转成列表 - 用
combine将当前组的ID-成员列表键值对合并到总映射中
验证结果
可以通过debug模块查看最终生成的映射:
- name: 输出映射结果 debug: var: group_member_map
注意:确保变量名和JSON中的属性名大小写完全匹配(比如Group_ID、User_ID的大小写不能写错),否则会提取失败。
内容的提问来源于stack exchange,提问作者YaserMow
相关产品推荐
相关产品推荐

