如何在Ansible中筛选roles为允许列表子集的用户条目?
Ansible 过滤用户角色列表的正确实现
先针对两种常见需求给出对应方案:
需求1:移除所有包含非允许角色的用户条目
如果要彻底删掉那些roles里存在allowed_roles之外角色的用户(比如alice带有admin角色,直接移除alice的整条数据),可以用select过滤器结合jinja2的subset测试实现:
先定义示例变量:
allowed_roles: [member, read, update] user_roles: - name: alice roles: [member, admin] - name: bob roles: [read, update] - name: charlie roles: [member]
过滤命令:
filtered_user_roles: "{{ user_roles | select(role_item => role_item.roles is subset(allowed_roles)) | list }}"
执行后filtered_user_roles里只会保留bob和charlie的条目,alice因roles包含不在允许列表的admin会被过滤掉。
需求2:保留用户条目,但移除其非允许角色
如果只是想清理用户roles中的非法角色(比如保留alice的条目,但去掉admin角色),可以用map+combine+intersect组合实现:
cleaned_user_roles: "{{ user_roles | map('combine', {'roles': item.roles | intersect(allowed_roles)}) | list }}"
执行后alice的roles会变为[member],其他用户角色保持不变,所有用户条目都被保留。
为什么selectattr不好用?
selectattr仅支持对属性做简单匹配(比如等于、包含单个值),无法直接判断列表的子集关系,因此需要用select配合自定义逻辑来实现复杂的过滤需求。
内容的提问来源于stack exchange,提问作者W4hf
相关产品推荐
相关产品推荐

