You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:07:05