Ansible-将多个AD用户添加到AD组

时间:2019-10-11 18:37:31

标签: ansible

我一直在寻找Interwebs来解决我的一本剧本的问题,但我相信我可能会比找出解决方案更加困惑。我希望不再有任何杂草,而是希望这里的人能够让我回到正确的道路上。

以最简单的形式,我的剧本需要创建一个AD组,然后根据从请求表单中收到的变量将成员添加到新创建的AD组中,这似乎并不困难...直到我想要从另一个变量中添加一个或五个以上。变量req_ad_user_name将始终需要是该组的成员。变量req_ad_user_others是表单上的可选字段。因此,根据每个唯一的请求,它可能只有一堆用户名,也可能没有。

test_playbook.yml

---
    - hosts: dc
      vars:
        domain_name: "{{ domain_override | default ('tst.local') }}"
        ou_path: "{{ ou_override | default('OU=IT,DC=tst,DC=local') }}"
        dc_name: "{{ dc_override | default ('dc1') }}"
        ad_group_name: "SOME_TEST_GROUP_RW"
        req_ad_user_name: "tst_user"
        req_ad_user_others: "tst_user2,tst_user3"
      tasks:
        - name: "Create AD Group for Internal Path"
          win_domain_group:
            name: "{{ ad_group_name }}"
            description: "Testing for internalpath"
            domain_server: "{{ dc_name }}"
            organizational_unit: "{{ ou_path }}"
            scope: global
            attributes:
              info: "Testing comments for tasknumber"

        - name: "Add Members to new group"
          win_domain_group_membership:
            name: "{{ ad_group_name }}"
            domain_server: "{{ dc_name }}"
            members:
              - "{{ req_ad_user_name }}"
            state: present
    ...

我最初的想法是从req_ad_user_name创建一个列表,如果不为空,则创建req_ad_user_others。然后,循环浏览“ win_domain_group_membership”模块中的成员列表,以将其添加到组中。但是,我无法弄清楚在不同的可能情况下其逻辑是什么。 任何帮助将非常感激。

1 个答案:

答案 0 :(得分:1)

Jinja模板可以为您提供您想要实现的所有功能。
以下是分解步骤:

  1. 我们需要从您的req_ad_user_name变量中列出一个列表:
- debug:
    msg: "{{ [req_ad_user_name] }}"
  1. 我们需要在逗号req_ad_user_otherssplit您的变量,
- debug:
    msg: "{{ req_ad_user_others.split(',') }}"
  1. 我们需要做一个concatenation of those two lists
- debug:
    msg: "{{ [req_ad_user_name] + req_ad_user_others.split(',') }}"
  1. 最后,我们需要考虑req_ad_user_others可能是空字符串(count加上0个字符)的可能性,在这种情况下,我们应该使用包含以下内容的列表:仅req_ad_user_name
- debug:
    msg: "{{ ([req_ad_user_name] + req_ad_user_others.split(',')) if req_ad_user_others | count > 0 else [req_ad_user_name] }}"

由于这总是会向您返回列表,因此应放心将其直接输入到执行expect a list as argumentmembers的{​​{1}}属性中。

win_domain_group_membership

Nota:我手边没有一个Active Directory可以针对此代码测试此代码,但是我非常有信心它应该可以解决问题。

关于变量操作的演示,这里是:

- name: "Add Members to new group"
  win_domain_group_membership:
    name: "{{ ad_group_name }}"
    domain_server: "{{ dc_name }}"
    members: "{{ ([req_ad_user_name] + req_ad_user_others.split(',')) if req_ad_user_others | count > 0 else [req_ad_user_name] }}"
    state: present

此输出

---
- hosts: localhost
  connection: local

  vars:
    req_ad_user_name: "tst_user"
    req_ad_user_others: "tst_user2,tst_user3"
    req_ad_user_others_empty: ""

  tasks:
    - name: Test with req_ad_user_others, containing two users tst_user2, tst_user3
      debug:
        msg: "{{ ([req_ad_user_name] + req_ad_user_others.split(',')) if req_ad_user_others | count > 0 else [req_ad_user_name] }}"

    - name: Test with req_ad_user_others_emtpy, an empty string
      debug:
        msg: "{{ ([req_ad_user_name] + req_ad_user_others_empty.split(',')) if req_ad_user_others_empty | count > 0 else [req_ad_user_name] }}"