AnsibleでActive Directory環境を完全自動構築する方法
この記事の内容
- AnsibleのPlaybookを使って、Active Directory環境の構築を完全自動化する手順を紹介します
- ADフォレスト作成・ドメイン参加・2台目ドメインコントローラー追加・時刻同期設定をコード化しています
- 変数ファイル(
vars.yml)を編集するだけで自分の環境に合わせてカスタマイズできます - GitHubリポジトリからクローンしてすぐ利用できる構成になっています
- 本記事は「企業でよくあるWindows/M365環境を構築してみるシリーズ」のPart10です
背景:手動作業をコード化した理由
前回までのシリーズでは、以下の作業を手動で実施してきました。
- ドメインコントローラー(DC)の作成
- 2台目ドメインコントローラーの追加
- クライアントPCのドメイン参加
- 時刻同期の設定
今回これらをAnsibleでコード化しました。きっかけは、動画制作に使っていたHyper-V環境を誤って削除してしまい、1から再構築が必要になったことです。サーバーのプロビジョニング自体はコードで自動化済みでしたが、AD関連の設定は手動作業が残っていたため、この機会に全てコード化することにしました。
動画を間隔を空けて収録する場合、環境を毎回再構築できる仕組みがあると非常に便利です。「まず手動でやって解説動画を撮影し、次にコード化する」という流れが、このシリーズの基本的な進め方になっています。
Playbookの構成
今回追加したPlaybookは以下の3つです。前回までの create-vms.yml に加え、新たに create-ad.yml としてまとめています。
| ファイル名 | 内容 |
|---|---|
create-ad-forest.yml | ADフォレストの作成・NTP設定 |
join-domain.yml | メンバーサーバー・クライアントのドメイン参加 |
add-dc.yml | 2台目ドメインコントローラーの追加 |
create-ad-forest.yml の内容
このPlaybookでは以下の処理を順番に実行します。
NTP(時刻同期)の設定
w32tmサービスを一時停止- 外部NTPサーバーを設定
- タイムサービスを開始
Active Directory ドメインサービスの役割追加
ADフォレスト(ドメイン)の作成
サーバーの再起動
DNSサーバーの設定
- 自分自身をDNSサーバーとして指定
- 逆引きゾーンの作成
このPlaybookは、インベントリ内の first_dc(最初のドメインコントローラー)ホストにのみ適用されます。例として 10.1.1.x の DC1-01 が最初のドメインコントローラーとして動作するよう設定しています。
# ホストの例
first_dc:
hosts:
DC1-01:
ansible_host: 10.1.1.x
join-domain.yml の内容
このPlaybookは domain_members グループに属するホストを対象に、ドメイン参加処理を実施します。
対象ホストは以下のとおりです。
- ドメインコントローラー2台目(
DC1-02):10.1.1.x - Windowsクライアント(Windows 10 / Windows 11)
処理の流れは次のとおりです。
- 変数ファイル(
vars.yml)の読み込み win_domain_membershipモジュールでドメイン参加- ドメイン名の指定
- 参加に使うユーザー名・パスワードの指定
- サーバーの再起動
- name: Join domain
win_domain_membership:
dns_domain_name: "{{ domain_name }}"
domain_admin_user: "{{ domain_admin_user }}"
domain_admin_password: "{{ domain_admin_password }}"
state: domain
add-dc.yml の内容
2台目以降のドメインコントローラーを追加するPlaybookです。dc2 グループのホストが対象になります(複数台の設定にも対応しています)。
処理の流れは次のとおりです。
- 変数ファイル(
vars.yml)の読み込み - Active Directory ドメインサービスの役割追加
- 既存ドメインへのドメインコントローラー追加
- 必要に応じてサーバーの再起動
- DNSサーバーの参照先を自分自身に設定
変数ファイル(vars.yml)の設定
環境のカスタマイズはすべて vars.yml で行います。リポジトリをクローンした後、このファイルだけ書き換えれば自分の環境に合わせた構築が可能です。
設定できる主な項目は以下のとおりです。
# ドメイン名
domain_name: "ad.local"
# ADの回復パスワード
recovery_password: "YourRecoveryPassword"
# 上位DNSサーバーのアドレス
upstream_dns: "8.8.8.8"
# 逆引きゾーン名
reverse_zone_name: "1.1.10.in-addr.arpa"
# NTPサーバー
ntp_server: "ntp.nict.jp"
# ドメイン管理者ユーザー
domain_admin_user: "Administrator"
# リバースDNSゾーン名
reverse_dns_zone: "1.1.10.in-addr.arpa"
Active Directoryの基本的な仕組みを理解していれば、各変数の意味はすぐに把握できます。
Playbookの実行方法
以下のコマンドで create-ad.yml を実行します。
ansible-playbook -i インベントリファイル create-ad.yml
実行が完了すると、以下の状態が自動で構築されます。
- ADフォレストおよびドメインの作成
- メンバーサーバー・クライアントのドメイン参加
- 2台目ドメインコントローラーの追加
動作確認
Playbookの実行後、以下の点を確認しました。
- Active Directory サイトとサービス:DC01とDC02が正しくドメインコントローラーとして登録されていることを確認
- ADドメイン:
ad.localという名前でフォレスト・ドメインが作成されていることを確認 - DNS名前解決:ドメイン名でのホスト解決が正常に動作していることを確認
- インターネット接続:IPアドレス・上位DNS設定を含め、インターネット疎通が確認できたこと
- クライアントのドメイン参加:Windowsクライアントからドメイン管理者アカウントでログインできることを確認
2台目のドメインコントローラーは追加直後のためレプリケーション設定は完了していませんが、時間が経過すれば自動的に複製が開始されます。また、DCへの役割追加直後はイベントログにエラーが記録される場合がありますが、しばらく待てば解消されます。
コードの入手方法
今回使用したPlaybookはGitHubリポジトリ「ansible-hyperv」に公開されています。リポジトリをクローンして vars.yml を編集するだけで、同様の環境が構築できます。
git clone https://github.com/(リポジトリURL)/ansible-hyperv.git
cd ansible-hyperv
# vars.yml を自分の環境に合わせて編集する
ansible-playbook -i inventory create-ad.yml
簡単な使い方はREADMEにも記載されていますが、詳細はコードを直接参照してください。
今後の展望
今回でオンプレミスのActive Directory環境の自動構築が完成しました。次のステップとして、クラウド(Azure)方面への展開を検討しています。
なお、Microsoft Entra ID(旧Azure AD)との同期(Entra ID Connect)については、Ansibleでの自動化が難しい部分が残っています。この部分は現時点では手動作業が必要になる見込みです。また、Entra ID Connectを構成する場合はドメイン名の要件があるため、今回の ad.local という内部ドメイン名のままでは対応できない点にも注意が必要です。
まとめ
- AnsibleのPlaybookを使うことで、ADフォレスト作成からドメイン参加・2台目DC追加まで、一連のActive Directory構築作業を完全自動化できます
vars.ymlの変数を書き換えるだけで、自分の環境に合わせたカスタマイズが可能です- AnsibleにはWindowsのAD操作に対応したモジュール(
win_domain_membership等)が用意されており、コードの実装は比較的シンプルです - 「まず手動で構築してから、コード化する」というアプローチは、仕組みの理解とコードの品質向上の両面で有効です
- 今後はAzure(クラウド)連携の自動化にも取り組んでいく予定です
シリーズの過去動画と組み合わせることで、ゼロからWindows/M365環境を自動構築する完全なパイプラインが手に入ります。AnsibleによるWindows環境の自動化に興味のある方は、ぜひリポジトリを試してみてください。