Windowsクライアントをコードで全自動展開する — Windows/M365環境構築シリーズ Part9

この記事の内容

  • Hyper-V上でWindows 10およびWindows 11のゴールデンイメージを作成する手順を解説します
  • Sysprepと応答ファイル(Unattend.xml)を組み合わせ、クライアントOSを全自動で構成する方法を紹介します
  • WinRMをオフライン環境でセットアップするためのHyper-Vゲストサービス活用法を説明します
  • サーバー版の応答ファイルとクライアント版の違いについてポイントを整理します
  • AnsibleプレイブックからCopy-VMFileコマンドレットを利用してVMを自動展開するフローを示します

はじめに

前回までのシリーズでは、Windows Serverのひな型(ゴールデンイメージ)をSysprepで作成し、コード1本で自動展開できる環境を構築してきました。しかし実際の検証環境ではクライアントOSも必要になります。そこで今回はWindows 10とWindows 11のひな型も作成し、サーバーと同じようにコードから自動展開できる仕組みを整えていきます。


Hyper-V仮想マシンの作成

まずHyper-V上に仮想マシンを2台作成します。

項目Windows 10Windows 11
世代第2世代第3世代
メモリ8GB8GB
ネットワーク接続しない接続しない

ポイント:ネットワークには接続しないこと

ひな型作成時にネットワークへ接続すると、Windows Updateが走るなど想定外の動作が起きやすくなります。ネットワークを切断した状態でセットアップを進めるほうが格段に楽です。

Windows 11特有の設定

Windows 11ではセキュリティ要件が厳しいため、仮想マシンのセキュリティ設定でTPM(トラステッドプラットフォームモジュール)を必ず有効化してください。有効にしないとISOからのインストール自体が弾かれてしまいます。


初回セットアップとAdministratorアカウントの準備

仮想マシンが起動したら、初期セットアップウィザードをローカルアカウントで進めます。ネットワーク未接続の状態であれば、Microsoftアカウントを求められることなくローカルユーザーでのセットアップが可能です。

セットアップ完了後は以下の手順でAdministratorアカウントを有効化します。

  1. セットアップ時に作成したローカルユーザーで一度ログオン
  2. 「コンピューターの管理」からセットアップ用ユーザーを削除
  3. ビルトインAdministratorアカウントを有効化
  4. Administratorでログオンし直す

このシリーズでは、Ansibleから管理する際にビルトインAdministratorで統一することでシンプルな管理を実現しています。なお、通常Sysprep実行後にAdministratorは無効化されますが、応答ファイル内に無効化を防ぐ記述を入れることで有効状態を維持します。


WinRMのセットアップ(オフライン環境での対処)

AnsibleからWindows VMをリモート管理するにはWinRMの構成が必要です。通常はインターネットからスクリプトをダウンロードして実行しますが、今回はネットワーク未接続のため別の方法を使います。

Hyper-Vゲストサービスを使ったファイル転送

Hyper-Vの「統合サービス」にあるゲストサービスを有効化すると、Copy-VMFileコマンドレットでホストからゲストへファイルをコピーできます。ネットワーク接続が不要なため、オフライン環境で非常に役立ちます。

まずゲストVM上で一時ディレクトリを作成しておきます。

New-Item -ItemType Directory -Path C:\temp

次にホスト側のHyper-V管理端末からスクリプトをゲストにコピーします。

Copy-VMFile "Windows10" `
  -SourcePath "C:\temp\ConfigureRemotingForAnsible.ps1" `
  -DestinationPath "C:\temp\ConfigureRemotingForAnsible.ps1" `
  -CreateFullPath `
  -FileSource Host

WinRM構成スクリプトの実行

ゲストVM内でPowerShellを管理者として起動し、スクリプト実行ポリシーを変更してからスクリプトを実行します。

Set-ExecutionPolicy Unrestricted -Force
cd C:\temp
.\ConfigureRemotingForAnsible.ps1

これでWinRMの設定と証明書の作成が完了し、AnsibleからリモートでVMを管理できる状態になります。Windows 10・Windows 11の両方で同じ手順を実施します。


応答ファイル(Unattend.xml)の作成

応答ファイルはWindows システムイメージマネージャー(Windows SIM)で作成します。クライアント版でポイントとなる設定項目を以下に示します。

Specializeパス

設定項目内容
コンピューター名ランダム生成
プロダクトキー指定
ロケール・タイムゾーン日本設定
WinRM有効化microsoft-windows-shell-setup で設定

oobeSystemパス(クライアント特有の設定)

ここがサーバー版と異なる主要箇所です。

<AutoLogon>
  <Enabled>true</Enabled>
  <Username>Administrator</Username>
  <Password>
    <Value>(パスワード)</Value>
    <PlainText>true</PlainText>
  </Password>
</AutoLogon>

<UserAccounts>
  <LocalAccounts>
    <LocalAccount>
      <Name>Administrator</Name>
      <Password>
        <Value>(パスワード)</Value>
      </Password>
    </LocalAccount>
  </LocalAccounts>
</UserAccounts>

自動ログオンを設定する理由:Sysprep後の初回起動時にビルトインAdministratorで自動ログオンさせることで、Administratorアカウントが有効化されます。また、ProtectYourPC3に設定してライセンス条項への自動承諾も組み込んでいます。


Sysprepの実行とゴールデンイメージの保管

応答ファイルをVMにコピーして、Sysprepを実行します。

Copy-VMFile "Windows10" `
  -SourcePath "C:\answer\unattend.xml" `
  -DestinationPath "C:\temp\unattend.xml" `
  -CreateFullPath `
  -FileSource Host

ゲストVM内でSysprepを実行します。

C:\Windows\System32\Sysprep\sysprep.exe /oobe /generalize /shutdown /unattend:C:\temp\unattend.xml

シャットダウンが完了したら、VHDXファイルをゴールデンイメージとして保管します。ファイル名に-goldを付けて管理するとわかりやすいです。


Ansibleプレイブックからの自動展開

Ansibleのインベントリファイルにクライアントの定義を追加します。

# インベントリ例(既存のDCに追加)
windows10:
  ansible_host: 192.168.x.x

windows11:
  ansible_host: 192.168.x.x

プレイブック側では以下のような形でWindows 10・Windows 11のVMを定義します。

- name: Windows 10
  type: win10
  source: win10-gold
  ip: 192.168.x.x

- name: Windows 11
  type: win11
  source: win11-gold
  ip: 192.168.x.x

プレイブックを実行すると、以下の処理が自動で行われます。

  1. ゴールデンイメージのVHDXをコピーしてVMを作成
  2. VMを起動(Sysprep済みのため自動構成が開始)
  3. 応答ファイルを読み取り、コンピューター名・パスワード・ネットワーク設定を適用
  4. WinRMで接続できるまで待機(タイムアウトは余裕を持って300秒以上に設定)
  5. 接続確認後、以降の構成タスクを実行

展開完了後は、設定したIPアドレスでPingが通り、インターネットへの疎通も確認できます。


サーバー版との応答ファイルの差分まとめ

設定項目サーバー版クライアント版
自動ログオン不要必要(Administrator有効化のため)
ユーザーアカウント設定ほぼ同様ローカルAdministratorのパスワード指定が必要
TPM設定不要(第2世代)必要(Windows 11・第3世代)
その他基本設定共通共通

Windows 11のローカルアカウントについて

Windows 11のホームエディションでオンライン接続時にMicrosoftアカウントが必須になるという話題がありますが、応答ファイルを使う場合はローカルアカウントでのセットアップが引き続き可能です。また、ネットワーク未接続の状態では物理的にMicrosoftアカウントを使えないため、Microsoftがそのようなユーザーを切り捨てる選択肢を取ることは考えにくく、今後もネット未接続時はローカルアカウントでセットアップできると予想されます。


まとめ

今回はWindows 10とWindows 11のクライアントOSについて、Sysprepと応答ファイルを使ったゴールデンイメージの作成と、Ansibleプレイブックによる全自動展開の仕組みを構築しました。

  • ネットワーク未接続でのひな型作成と、Hyper-Vゲストサービスを使ったオフラインファイル転送
  • ビルトインAdministratorの有効化と自動ログオン設定が、クライアント版の応答ファイルにおける重要ポイント
  • Windows 11ではTPM有効化が必須

これにより、インベントリにWindowsサーバー・Windows 10・Windows 11の記述を追加するだけで、検証環境を丸ごとコードで再現できるようになりました。次回はこの環境を活用したさらなる構成自動化を進めていきます。