Ansible から Windows Active Directory を操作してみよう!

みなさんこんにちは。レッドハットの杉村です。Ansible のテクニカルサポートをしています。

今回は Ansible から Windows Active Directory を操作してみようということで、簡単な Windows の扱い方や、変数のパラメータ化、Tower での実行例について軽く説明したいと思います。

対象としては Windows 2019 を用意しました。Ansible から接続できるように、初期設定をしておきました。詳細はこちらのサイトをご覧ください。

https://docs.ansible.com/ansible/latest/user_guide/windows_setup.html

インベントリファイルを書きます。最近は ini 形式ではなく yaml で書くのが好みです。

---
windows:
  hosts:
    192.168.0.158:
      ansible_connection: winrm
      ansible_password: your_password_as_you_like1!
      ansible_user: Administrator
      ansible_winrm_server_cert_validation: ignore
      ansible_winrm_transport: basic

Ad hoc コマンドの win_ping を使って、Ansible から接続できることを確認します。

$ ansible -i inventory.yml -m win_ping windows
192.168.0.158 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

これであとはプレイブックを書けば操作できます。

Windows 2019 には Active Directory を設定してみました。ドメインはここでは ANSIBLE.JP.REDHAT.COM としています。

f:id:sugitk:20200318112955p:plain

この Active Directory を Ansible から操作してみようというのが今回の目的です。ユーザを作ったり消したりしてみようと思います。

モジュールを検索しますと、win_domain_user モジュールが使えそうです。

https://docs.ansible.com/ansible/latest/modules/win_domain_user_module.html

試しにプレイブックを書いてみます。

---
- hosts: windows
  gather_facts: false
  tasks:
  - win_domain_user:
      name: ansibleuser
      firstname: Ansible
      surname: User
      groups:
        - Domain Users
      password: p@ssw0rd
      state: present

実行してみました。

$ ansible-playbook -i inventory.yml playbook.yml 

PLAY [windows] ********************************************************************************************
TASK [win_domain_user] ********************************************************************************************
changed: [192.168.0.158]

PLAY RECAP ***************************************************************************
192.168.0.158              : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Windows でも確認してみます。正しくユーザが作られていました。簡単ですね。

f:id:sugitk:20200318113027p:plain

逆に、ユーザを削除することもできます。

---
- hosts: windows
  gather_facts: false
  tasks:
  - win_domain_user:
      name: ansibleuser
      state: absent

次に、ユーザ作成のプレイブックをパラメータ化してみます。

---
- hosts: windows
  gather_facts: false
  tasks:
  - win_domain_user:
      name: "{{ username }}"
      firstname: "{{ firstname }}"
      surname: "{{ surname }}"
      groups:
        - Domain Users
      password: "{{ password }}"
      state: present

このままでは実行できません。

TASK [win_domain_user] *******************************************************************************************************************
fatal: [192.168.0.158]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'username' is undefined\n\nThe error 
appears to be in '/home/ec2-user/blog20200318/playbook_user_create.yml': line 5, column 5, but may\nbe elsewhere in the file depending on the exact 
syntax problem.\n\nThe offending line appears to be:\n\n  tasks:\n  - win_domain_user:\n    ^ here\n"}

extra vars として外から渡す必要があります。JSON 形式で書いて渡してみます。

{
  "username": "user1",
  "firstname": "Ansible",
  "surname": "User",
  "password": "a_passw0rd_for_ans1ble_user!"
}
$ ansible-playbook -i inventory.yml playbook_user_create.yml --extra-vars "@param.json"

PLAY [windows] *****************************************************************************

TASK [win_domain_user] ************************************************************************************************
changed: [192.168.0.158]

PLAY RECAP ************************************************************************************************
192.168.0.158              : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

パラメータ化しておくことで、再利用性がとても高まります。

ここまででも便利に使えるとは思いますが、Ansible Tower からも動かせるようにしてみました。ジョブテンプレートを作成するときに survey を設定することで、extra vars としてのパラメータ渡しができるようになります。

なお、Tower でプレイブックを動かすときには、hosts: all として対象をインベントリから選択するようにする必要があります。

f:id:sugitk:20200318113056p:plain

こちらは実行してみたときの例です。

f:id:sugitk:20200318113116p:plain

Windows に構築した AD を Ansible から設定してみる例を取り上げまして、パラメータ化してTower に載せてみるところまでやってみました。他の設定や操作にも応用が効くと思いますので、これをヒントにしてあれこれ試してみてください。

Ansible Towerの評価ライセンスリクエストはこちらからご利用いただけます。

www.ansible.com

Happy Automation!

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。