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” を設定しているのがわかると思います。
vagrant
true</plaintext><br><br> </password><br><br> <username>vagrant</username><br><br> <enabled>true</enabled><br><br> </autologon></pre> <p>また、<strong>autounattend.xml</strong> には、Windows OS のインストール後の最初のログオン時に実行するコマンドのセクションもあります。バッチスクリプトと PowerShell スクリプトの両方がサポートされており、様々な設定が可能です。上のビルダーの例では、Windows のアップデートをVMにインストールする <strong>win-updates.ps1</strong> という PowerShell スクリプトが実行されるよう設定しています。</p> <p><strong>autounattend.xml</strong> ファイルで様々な設定が可能なことは上述の通りですが、250ラインに及ぶ詳細なファイルは、<a href="https://github.com/StefanScherer/packer-windows/blob/my/answer_files/10/Autounattend.xml" rel="noopener" target="_blank">ここ</a>からアクセスできます。</p> <h2>コミュニケーター</h2> <p>Packer が VM と通信する一般的な方法は SSH です。OpenSSH を使用することも可能ですが、Windows でより一般的なリモート通信方法は WinRM です。先に示したPacker テンプレートのビルダー部分にあるように、Packer テンプレートで WinRM 接続して認証するよう設定できます。</p> <pre>"winrm_password": "vagrant",<br><br>"winrm_timeout": "",<br><br>"winrm_username": "vagrant"</pre> <p>Windows の場合、WinRM はデフォルトで、ドメイン外の2台のコンピュータ間でSSL暗号化を要求します。Packer のホストとビルドVM間の通信を可能にする最も簡単な方法(安全は保証されていないものの)は、暗号化されていないトラフィック(HTTP)を許可することです。それを行う Scherer 氏の Github スクリプトは、<a href="https://github.com/StefanScherer/packer-windows/blob/my/scripts/enable-winrm.ps1" rel="noopener" target="_blank" data-sf-ec-immutable="">ここ</a>からアクセスできます。</p> <h2>ISOファイルの使用</h2> <p>Windows イメージを作成する基本的な方法は、Windows インストールISOを使用することです。テストのためには、Microsoft のトライアルISOを使用することができます。または、組織での使用のために提供されるボリュームライセンスISOを使うこともできます。Packer テンプレートで、ISOファイル、チェックサム、チェックサムタイプの3つのフィールドを設定します(実行時にコマンドパッカービルドに情報をパスすることもできます)。Scherer 氏の Windows 10 のテンプレートでは、ビルドセクションでユーザー変数を使用し、変数セクションで実際の値を設定しています。</p> <p>ビルドセクション:</p> <pre>"iso_checksum": "",<br><br>"iso_checksum_type": "",<br><br>"iso_url": "",</pre> <p>変数セクション:</p> <pre>"iso_checksum": "27e4feb9102f7f2b21ebdb364587902a70842fb550204019d1a14b120918e455",<br><br> "iso_checksum_type": "sha256",<br><br> "iso_url": "https://software-download.microsoft.com/download/pr/17134.1.180410-1804.rs4_release_CLIENTENTERPRISEEVAL_OEMRET_x64FRE_en-us.iso"</pre> <h2>デモ</h2> <p>簡単なデモンストレーションを表示するために、Scherer 氏のレポジトリをローカルにダウンロードしてパッカービルドを実行します。筆者(dan) のWindows 10イメージがビルドされ、virtualbox を作成し、Windows 10 のトライアルISOをダウンロードしてデフォルト設定を行います。下のアウトプットで、ISOがダウンロードされ、スクリプトがVMのフロッピードライブにコピーされているのがわかります。</p> <pre>Dans-MacBook-Pro:packer-windows-my dan$ ~/packer build -only=virtualbox-iso windows_10.json<br><br>virtualbox-iso output will be in this color.<br><br> <br><br>==> virtualbox-iso: Downloading or copying ISO<br><br> virtualbox-iso: Downloading or copying: https://software-download.microsoft.com/download/pr/17134.1.180410-1804.rs4_release_CLIENTENTERPRISEEVAL_OEMRET_x64FRE_en-us.iso<br><br> virtualbox-iso: Download progress: 90%<br><br> virtualbox-iso: Download progress: 91%<br><br> virtualbox-iso: Download progress: 92%<br><br> virtualbox-iso: Download progress: 94%<br><br> virtualbox-iso: Download progress: 95%<br><br> virtualbox-iso: Download progress: 96%<br><br> virtualbox-iso: Download progress: 97%<br><br> virtualbox-iso: Download progress: 99%<br><br> virtualbox-iso: Download progress: 100%<br><br> virtualbox-iso: Download progress: 100%<br><br>==> virtualbox-iso: Creating floppy disk...<br><br> virtualbox-iso: Copying files flatly from floppy_files<br><br> virtualbox-iso: Copying file: ./answer_files/10/Autounattend.xml<br><br> virtualbox-iso: Copying file: ./floppy/WindowsPowershell.lnk<br><br> virtualbox-iso: Copying file: ./floppy/PinTo10.exe<br><br> virtualbox-iso: Copying file: ./scripts/fixnetwork.ps1<br><br> virtualbox-iso: Copying file: ./scripts/disable-screensaver.ps1<br><br> virtualbox-iso: Copying file: ./scripts/disable-winrm.ps1<br><br> virtualbox-iso: Copying file: ./scripts/enable-winrm.ps1<br><br> virtualbox-iso: Copying file: ./scripts/microsoft-updates.bat<br><br> virtualbox-iso: Copying file: ./scripts/win-updates.ps1<br><br> virtualbox-iso: Done copying files from floppy_files<br><br> virtualbox-iso: Collecting paths from floppy_dirs<br><br> virtualbox-iso: Resulting paths from floppy_dirs : []<br><br> virtualbox-iso: Done copying paths from floppy_dirs<br><br>==> virtualbox-iso: Creating virtual machine...<br><br>==> virtualbox-iso: Creating hard drive...<br><br>==> virtualbox-iso: Attaching floppy disk...<br><br>==> virtualbox-iso: Creating forwarded port mapping for communicator (SSH, WinRM, etc) (host port 4194)<br><br>==> virtualbox-iso: Executing custom VBoxManage commands...<br><br> virtualbox-iso: Executing: modifyvm windows_10 --memory 2048<br><br> virtualbox-iso: Executing: modifyvm windows_10 --cpus 2<br><br>==> virtualbox-iso: Starting the virtual machine...<br><br>==> virtualbox-iso: Waiting 6m0s for boot...<br><br>==> virtualbox-iso: Typing the boot command...<br><br>==> virtualbox-iso: Waiting for WinRM to become available...<br><br> virtualbox-iso: WinRM connected.</pre> <h2>まとめ</h2> <p>Packerのイメージビルドで主にサポートされているOSは Linux ですが、Windows もしっかりサポートされています。Packer で、”unattended” 手法を使ってクリーンな Windows イメージビルドを作成できます。</p></plaintext></password></autologon></pre>
Dan Franciscus
Dan Franciscus is a systems engineer and VMware Certified Professional (VCP) specializing in VMware, PowerShell, and other Microsoft-based technologies. You can reach Dan at his blog (http://www.winsysblog.com/) or Twitter at @dan_franciscus.