Packer は、Linux だけでなく Windows もサポートしていますが、OSイメージの作成方法は両者で大きく異なります。このブログでは、Packer で Windows OS イメージを作成する方法を説明します。
前のブログに書いたように、Packerは、Hashicorp が提供するオープンソースのオペレーティングシステム・イメージ構築ツールです。 Packerの優れた特徴は、1つの設定から複数のプラットフォーム(AWS、Azure、VMwareなど)用に異なるアーティファクトを作成できる点です。Packer は Linux イメージと Windows イメージの両方の作成をサポートしており、単一の方法でイメージ構築が可能です。
参考リソース
新しい技術を学ぶとき、他の人がどのように使っているかの例を見るのは非常に参考になります。Packer を Windows で使用するのに参考になる最良のリソースは、Joe Fitzgerald 氏の GitHub リポジトリとそのフォークである Stefan Scherer 氏の Github リポジトリです。これら2つのリポジトリにある例を見ると、ツールを組み合わせて Windows ビルドを自動化する方法がよくわかります。Scherer 氏の Windows 10 用の Packer テンプレートを使って、Packer で Windows ビルドを作成する方法を説明します。
autounattend ファイル
Windows OS インストールを自動化するのに最も重要なのは、おそらく autounattend.xml ファイルでしょう。これは Packer だけに限定されるものではなく、Windows のインストール自動化のために誰でも使えるファイルです。Windows OS インストールディスクを起動すると、デフォルトで、インストールするディスクなどのインストール・オプションを選択するようプロンプト指示されますが、これらのオプションはすべて autounattend.xml ファイルで設定できます。このファイルは、リムーバブルドライブに配置する必要があります。Packerでこれを行うには、フロッピードライブ経由で仮想マシンにマウントします。次は Packer テンプレートのビルダー部分の例です。
"builders": [
{
"boot_wait": "6m",
"communicator": "winrm",
"cpu": "2",
"disk_size": "",
"floppy_files": [
"./answer_files/autounattend.xml",
"./floppy/WindowsPowershell.lnk",
"./floppy/PinTo10.exe",
"./scripts/fixnetwork.ps1",
"./scripts/disable-screensaver.ps1",
"./scripts/disable-winrm.ps1",
"./scripts/enable-winrm.ps1",
"./scripts/microsoft-updates.bat",
"./scripts/win-updates.ps1"
],
"guest_additions_mode": "none",
"iso_checksum": "",
"iso_checksum_type": "",
"iso_url": "",
"ram_size": "2048",
"shutdown_command": "shutdown /s /t 10 /f /d p:4:1 /c \"Packer Shutdown\"",
"switch_name": "",
"type": "hyperv-iso",
"vm_name": "windows_10",
"winrm_password": "vagrant",
"winrm_timeout": "",
"winrm_username": "vagrant"
}
フロッピーファイルのセクションで、ローカル・ファイル /answer_files/autounattend.xml をコピーしてマウントするよう設定しています。OSインストール時の Windows のプロンプトに自動応答するためのさまざまな設定を、autounattend.xml の内部に記述しておくことができます。たとえば、自動ログオンアカウントに、ユーザー名とパスワード、”vagrant” を設定しているのがわかると思います。
<AutoLogon>
<Password>
<Value>vagrant</Value>
<PlainText>true</PlainText>
</Password>
<Username>vagrant</Username>
<Enabled>true</Enabled>
</AutoLogon>
また、autounattend.xml には、Windows OS のインストール後の最初のログオン時に実行するコマンドのセクションもあります。バッチスクリプトと PowerShell スクリプトの両方がサポートされており、様々な設定が可能です。上のビルダーの例では、Windows のアップデートをVMにインストールする win-updates.ps1 という PowerShell スクリプトが実行されるよう設定しています。
autounattend.xml ファイルで様々な設定が可能なことは上述の通りですが、250ラインに及ぶ詳細なファイルは、ここからアクセスできます。
コミュニケーター
Packer が VM と通信する一般的な方法は SSH です。OpenSSH を使用することも可能ですが、Windows でより一般的なリモート通信方法は WinRM です。先に示したPacker テンプレートのビルダー部分にあるように、Packer テンプレートで WinRM 接続して認証するよう設定できます。
"winrm_password": "vagrant",
"winrm_timeout": "",
"winrm_username": "vagrant"
Windows の場合、WinRM はデフォルトで、ドメイン外の2台のコンピュータ間でSSL暗号化を要求します。Packer のホストとビルドVM間の通信を可能にする最も簡単な方法(安全は保証されていないものの)は、暗号化されていないトラフィック(HTTP)を許可することです。それを行う Scherer 氏の Github スクリプトは、ここからアクセスできます。
ISOファイルの使用
Windows イメージを作成する基本的な方法は、Windows インストールISOを使用することです。テストのためには、Microsoft のトライアルISOを使用することができます。または、組織での使用のために提供されるボリュームライセンスISOを使うこともできます。Packer テンプレートで、ISOファイル、チェックサム、チェックサムタイプの3つのフィールドを設定します(実行時にコマンドパッカービルドに情報をパスすることもできます)。Scherer 氏の Windows 10 のテンプレートでは、ビルドセクションでユーザー変数を使用し、変数セクションで実際の値を設定しています。
ビルドセクション:
"iso_checksum": "",
"iso_checksum_type": "",
"iso_url": "",
変数セクション:
"iso_checksum": "27e4feb9102f7f2b21ebdb364587902a70842fb550204019d1a14b120918e455",
"iso_checksum_type": "sha256",
"iso_url": "https://software-download.microsoft.com/download/pr/17134.1.180410-1804.rs4_release_CLIENTENTERPRISEEVAL_OEMRET_x64FRE_en-us.iso"
デモ
簡単なデモンストレーションを表示するために、Scherer 氏のレポジトリをローカルにダウンロードしてパッカービルドを実行します。筆者(dan) のWindows 10イメージがビルドされ、virtualbox を作成し、Windows 10 のトライアルISOをダウンロードしてデフォルト設定を行います。下のアウトプットで、ISOがダウンロードされ、スクリプトがVMのフロッピードライブにコピーされているのがわかります。
Dans-MacBook-Pro:packer-windows-my dan$ ~/packer build -only=virtualbox-iso windows_10.json
virtualbox-iso output will be in this color.
==> virtualbox-iso: Downloading or copying ISO
virtualbox-iso: Downloading or copying: https://software-download.microsoft.com/download/pr/17134.1.180410-1804.rs4_release_CLIENTENTERPRISEEVAL_OEMRET_x64FRE_en-us.iso
virtualbox-iso: Download progress: 90%
virtualbox-iso: Download progress: 91%
virtualbox-iso: Download progress: 92%
virtualbox-iso: Download progress: 94%
virtualbox-iso: Download progress: 95%
virtualbox-iso: Download progress: 96%
virtualbox-iso: Download progress: 97%
virtualbox-iso: Download progress: 99%
virtualbox-iso: Download progress: 100%
virtualbox-iso: Download progress: 100%
==> virtualbox-iso: Creating floppy disk...
virtualbox-iso: Copying files flatly from floppy_files
virtualbox-iso: Copying file: ./answer_files/10/Autounattend.xml
virtualbox-iso: Copying file: ./floppy/WindowsPowershell.lnk
virtualbox-iso: Copying file: ./floppy/PinTo10.exe
virtualbox-iso: Copying file: ./scripts/fixnetwork.ps1
virtualbox-iso: Copying file: ./scripts/disable-screensaver.ps1
virtualbox-iso: Copying file: ./scripts/disable-winrm.ps1
virtualbox-iso: Copying file: ./scripts/enable-winrm.ps1
virtualbox-iso: Copying file: ./scripts/microsoft-updates.bat
virtualbox-iso: Copying file: ./scripts/win-updates.ps1
virtualbox-iso: Done copying files from floppy_files
virtualbox-iso: Collecting paths from floppy_dirs
virtualbox-iso: Resulting paths from floppy_dirs : []
virtualbox-iso: Done copying paths from floppy_dirs
==> virtualbox-iso: Creating virtual machine...
==> virtualbox-iso: Creating hard drive...
==> virtualbox-iso: Attaching floppy disk...
==> virtualbox-iso: Creating forwarded port mapping for communicator (SSH, WinRM, etc) (host port 4194)
==> virtualbox-iso: Executing custom VBoxManage commands...
virtualbox-iso: Executing: modifyvm windows_10 --memory 2048
virtualbox-iso: Executing: modifyvm windows_10 --cpus 2
==> virtualbox-iso: Starting the virtual machine...
==> virtualbox-iso: Waiting 6m0s for boot...
==> virtualbox-iso: Typing the boot command...
==> virtualbox-iso: Waiting for WinRM to become available...
virtualbox-iso: WinRM connected.
まとめ
Packerのイメージビルドで主にサポートされているOSは Linux ですが、Windows もしっかりサポートされています。Packer で、”unattended” 手法を使ってクリーンな Windows イメージビルドを作成できます。