Ansible で Active Directory に Organizational Unit(OU)を作る

community.windows コレクション の現時点で最新の 1.6.0 には、グループやユーザの管理の機能はありますが、それらが所属する Organizational Unit(OU)自体の管理の機能が含まれません。

Ansible で Active Directory の OU そのものの作成や変更・削除を行うには、PowerShell DSC の ActiveDirectoryDsc モジュール に含まれる ADOrganizationalUnit リソースansible.windows.win_dsc モジュールで呼び出すことで実現できます。

以下、階層化された OU を作るプレイブックの簡単な実装例とその実行例です。

---
- hosts: dc1.ansible.local
  gather_facts: false

  vars:
    organizational_units:
      - name: Hands-On Lab
        path: DC=ansible,DC=local
        description: Container for Hands-On Lab management
        # protected: true / false
        # state: present / absent
      - name: Management
        path: OU=Hands-On Lab,DC=ansible,DC=local
        description: Container for Lab Management
      - name: Development
        path: OU=Hands-On Lab,DC=ansible,DC=local
        description: Container for Lab Users
        state: present

  tasks:
    - name: Ensure required module is installed
      community.windows.win_psmodule:
        name: ActiveDirectoryDsc
        state: present

    - name: Ensure OUs are exist
      ansible.windows.win_dsc:
        resource_name: ADOrganizationalUnit
        Name: "{{ item.name }}"
        Path: "{{ item.path }}"
        Description: "{{ item.description | default(omit) }}"
        ProtectedFromAccidentalDeletion: "{{ item.protected | default(omit) }}"
        Ensure: "{{ item.state | default(omit) }}"
      loop: "{{ organizational_units }}"

この例では、あるべき OU の状態は変数で定義して loop で渡しています。また、ActiveDirectoryDsc モジュールはデフォルトでは含まれないので、はじめに community.windows.win_psmodule でインストール済みの状態にさせています。

$ ansible-runner run . -p ad_manage_ous.yml

PLAY [dc1.ansible.local] *******************************************************

TASK [Ensure required module is installed] *************************************
ok: [dc1.ansible.local]

TASK [Ensure OUs are exist] ****************************************************
changed: [dc1.ansible.local] => (item={'name': 'Hands-On Lab', 'path': 'DC=ansible,DC=local', 'description': 'Container for Hands-On Lab management'})
changed: [dc1.ansible.local] => (item={'name': 'Management', 'path': 'OU=Hands-On Lab,DC=ansible,DC=local', 'description': 'Container for Lab Management'})
changed: [dc1.ansible.local] => (item={'name': 'Development', 'path': 'OU=Hands-On Lab,DC=ansible,DC=local', 'description': 'Container for Lab Users', 'state': 'present'})

PLAY RECAP *********************************************************************
dc1.ansible.local          : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

できました。

削除も EnsureAbsent が渡るようにすれば実行されます。ただし、誤消去防止の保護フラグが立っていても問答無用で消しにかかるようなので、その点は注意が必要そうです。

利用できるパラメータの詳細は、Get-Help about_ADOrganizationalUnit で確認できます。

@kurokobo

くろいです。ギターアンサンブルやら音響やらがフィールドの IT やさんなアルトギター弾き。たまこう 48 期ぎたさん、SFC '07 おんぞう、新日本ギターアンサンブル、Rubinetto。今は野良気味。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です