使用 Ansible 2.2.1,我需要测试给定用户的组成员身份。
- name : get users details
win_user:
name: "{{ myUser }}"
state: query
register: userData
- debug:
msg: "userData.groups : {{ userData.groups }}"
现在我想测试 myUser 是否属于myGroup="Administrators"
某个条件中的“myGroup”(例如)when
。条件userData.groups
是:
ok:[test-machine] => {“msg”:“userData.groups:[{u'path':u'WinNT://WORKGROUP/TEST-MACHINE/Administrators',u'name':u'Administrators'},{u'path':u'WinNT://WORKGROUP/TEST-MACHINE/Performance Monitor Users',u'name':u'Performance Monitor Users'}]”}
所以在这里我们看到我的用户属于两个组:“管理员”和“性能监视器用户”。
如何编写 when 语句来测试用户是否属于特定组?
我尝试过一些组合with_elements
,with_dict
但目前没有成功。
答案1
您可以使用map
筛选提取帐户的组列表并使用in
操作员测试成员资格:
- debug:
msg: "membership confirmed"
when: "'Administrators' in (userData.groups | map(attribute='name') | list)"
Administrators
如果用变量替换字符串myGroup
,则无需使用引号:
- debug:
msg: "membership confirmed"
when: myGroup in (userData.groups | map(attribute='name') | list)
vars:
myGroup: Administrators
另一种方法(比上面的方法不太清楚)是使用selectattr
和search
或match
过滤器并检查结果列表是否为空。过滤器允许部分匹配 ( search
) 或正则表达式 ( match
)。例如:
- debug:
msg: "membership confirmed"
when: userData.groups | selectattr('name', 'matches', 'Dom.*Adm.*') | list | length > 0
答案2
我想这就是你要找的:
---
- hosts: localhost
gather_facts: no
vars:
groupdict:
- name: 'Administrators'
path: 'WinNT://WORKGROUP/TEST-MACHINE/Administrators'
- name: 'Performance Monitor Users'
path: 'WinNT://WORKGROUP/TEST-MACHINE/Performance Monitor Users'
tasks:
- debug: msg="{{ groupdict }}"
- debug:
msg: "is admin"
with_items: "{{ groupdict }}"
when: item.name == "Administrators"
由于我不经常使用窗口,所以我只是创建了一个变量。基本上,你想迭代列表:with_items: "{{ userData.groups }}"
然后你想像这样匹配:when: item.name == "Administrators"
。你也可以用变量替换“管理员”