Ansible for Windows:测试组成员身份

Ansible for Windows:测试组成员身份

使用 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_elementswith_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

另一种方法(比上面的方法不太清楚)是使用selectattrsearchmatch过滤器并检查结果列表是否为空。过滤器允许部分匹配 ( 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"。你也可以用变量替换“管理员”

相关内容