みなさんこんにちは。レッドハットの杉村です。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 としています。

この 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 でも確認してみます。正しくユーザが作られていました。簡単ですね。

逆に、ユーザを削除することもできます。
---
- 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 として対象をインベントリから選択するようにする必要があります。

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

Windows に構築した AD を Ansible から設定してみる例を取り上げまして、パラメータ化してTower に載せてみるところまでやってみました。他の設定や操作にも応用が効くと思いますので、これをヒントにしてあれこれ試してみてください。
Ansible Towerの評価ライセンスリクエストはこちらからご利用いただけます。
Happy Automation!