2017年10月21日土曜日

packer で WindowsServer2016 に vmware-tools をインストールしてみた

概要

packer はデフォルトだと vmware-tools のインストーラが入った圧縮ファイル windows.iso を Windows サーバ側にアップロードするところまでしかやってくれません
自動化する場合にはアップロードされた iso ファイルを解凍して setup.exe を実行するスクリプトを自分で作成する必要があります
今回はその方法を紹介したいと思います

環境

  • ESXi 6.0.0 (Build 3620759)
  • Ubuntu 16.0.4
  • packer 1.0.4

vmware-tools をインストールするバッチスクリプトの作成

ISO を展開して setup.exe を叩くバッチスクリプトです
下部で説明をしています

  • vim scripts/install_tools.bat
if not exist "C:\Windows\Temp\7z920-x64.msi" (
    powershell -Command "(New-Object System.Net.WebClient).DownloadFile('http://www.7-zip.org/a/7z920-x64.msi', 'C:\Windows\Temp\7z920-x64.msi')" <NUL
)
msiexec /qb /i C:\Windows\Temp\7z920-x64.msi

if not exist "C:\Windows\Temp\windows.iso" (
    powershell -Command "(New-Object System.Net.WebClient).DownloadFile('http://softwareupdate.vmware.com/cds/vmw-desktop/ws/12.0.0/2985596/windows/packages/tools-windows.tar', 'C:\Windows\Temp\vmware-tools.tar')" <NUL
    cmd /c ""C:\Program Files\7-Zip\7z.exe" x C:\Windows\Temp\vmware-tools.tar -oC:\Windows\Temp"
    FOR /r "C:\Windows\Temp" %%a in (VMware-tools-windows-*.iso) DO REN "%%~a" "windows.iso"
    rd /S /Q "C:\Program Files (x86)\VMWare"
)

cmd /c ""C:\Program Files\7-Zip\7z.exe" x "C:\Windows\Temp\windows.iso" -oC:\Windows\Temp\VMWare"
cmd /c C:\Windows\Temp\VMWare\setup.exe /S /v"/qn REBOOT=R\"

ちょっと長いですがやってることは単純です
まず 7z をインストールします
サイトからインストーラをダウンロードして msiexec コマンドでインストーラを実行してインストールします
7z をインストール理由は iso ファイルを展開するためです

そして次に vmware-tools が入っている iso をダウンロードし解凍します
C:\Windows\Temp\windows.iso に iso ファイルがあるかないか確認し、ない場合は VMware さんが公開している tools-windows.tar をダウンロードし解凍します
これで iso が取得できます

あとは iso を 7z で展開して vmware-tools のインストーラである setup.exe を実行しています
インストール処理はだいたい 30 分程度で終了します

テンプレートファイル修正

provisioners で上記のバッチスクリプトを実行します

  • vim win2016.json
"provisioners": [
    {
        "type": "windows-shell",
        "execute_command": "{{ .Vars }} cmd /c C:/Windows/Temp/script.bat",
        "scripts": [
            "scripts/install_tools.bat"
        ]
    }
]

まず type は windows-shell を指定します
他に shell というタイプもありますが、これは Linux 用のタイプなので違います
execute_command はこのまま使います
scripts で指定したバッチスクリプトは Windows サーバ側にアップロードされます
その際のアップロード先が C:/Windows/Temp/script.bat になります
これは remote_path でも設定できますが指定しない場合は上記のパスになります
あとは cmd で実行していくだけです

で実は以下の設定を builders に設定して実行していました

"tools_upload_flavor": "windows",
"tools_upload_path": "c:/Windows/Temp/windows.iso",

packer のドキュメントを見るとこれを指定すると ESXi 上にある windows.iso という vmware-tools が入った ISO を Windows サーバ側にアップロードしてくれるのですがどうもアップロードしてくれません
いろいろと調べるとこれ絡みの issue が見つかるのでバグの可能性もあるかもしれません (使い方が悪いだけかもしれません)

で本来はこれで Windows サーバ側に ISO がアップロードされるのでわざわざ VMware さんのサイトから tools-windows.tar をダウンロードする必要がなかったのですが、どうしてもアップロードできず泣く泣くダウンロード方式にしました
なので、本当はダウンロードする部分の処理はまるごと削除できます

動作確認

実行してみましょう
packer のログが長いので省略しますが iso が展開され setup.exe が実行されエラーがでなければ OK です

作成された vmx ファイルをデプロイして VM を起動すると vmware-tools がインストールされている状態で起動するのが確認できると思います

最後に

packer + WindowsServer2016 のビルドで vmware-tools の自動インストールを行ってみました
今回は vmware-toosl のインストーラを Web から取得する方式で行いました
またバッチスクリプトで実装していますが、まるっとそのまま Powershell に置き換えることもできると思います
provisioners 内にバッチやら Powershell やらいろいろと混在するのが嫌な方は書き直しても良いかと思います

ちなみに今回のバッチスクリプトは参考サイトにあるものを流用しているので、参考サイトにあるバッチスクリプトをそのまま使っても OK です

1 つアドバイスですが packer でプロビジョニング系のスクリプトを書く場合は一旦普通に動作している VM を作成するのをおすすめします
その VM でバッチやら Powershell やらを書いてそこで動作確認してから packer に組み込んだほうが効率が良いです
スクリプトを書き換えて毎回 packer build していると正直ビルド時間が非常にかかるので効率が悪いかなと思います

参考サイト

0 件のコメント:

コメントを投稿