PowerCLI が core 対応してしばらく経ちますが、ImageBuilder モジュールは未だ core 対応されておらず、レガシーな PowerShell 環境(-v5.1)が必要で実質 Windows 環境が必須。
特に Mac しか持っていないユーザにとってカスタムイメージ作成のかなり高い障壁に…
Windows worker な CI/CD でなんとかなる?
別に恒常的な Windows 環境が欲しいわけでは無く、 イメージ作成する時だけ ImageBuilder が動く環境さえあればいいわけで…
ん、いわばビルド環境の話であれば CI/CD ツールでなんとかなるのでは…?
というわけで、Github が提供する CI/CD ツール Github Actions の仕様を眺めてみる。
仮想環境
Windows Server 2022
Windows Server 2019
Windows Server 2016[deprecated]
docs.github.com
Windows Server がいけそうな…コレはイケるのでは…
さらに調べていると下記ブログ。
iucstscui.hatenablog.com
shell: powershell
指定で PowerShell v5.1 が上がってくるらしい。
これは期待が高まる。
Github Actions を設定する
Github Actions のワークフローを動かすには以下の流れ。
Github Actions の設定として書くワークフロー用の yaml 構文は以下を参考に。
docs.github.com
この yaml の中に PowerCLI のインストールから一連の ImageBuilder の cmdlet を並べていけば良さげ。
出来上がった ISO は artifact として Github にアップロードしてしまう。
従来のようにExport-EsxImageProfile
で ISO を出力することもできそうではあるが、オフラインバンドルの入手や Github Actions 環境への配備が面倒なので、New-IsoImage
でオフラインバンドルダウンロードとイメージ生成を一気にやってしまうのがお手軽。
blog.kurokobo.com
ワークフロー yaml を書く
とりあえず vib 追加などは行わず、単純にオフラインバンドルから ISO を生成してみる。
初めて使うけどこんな感じでよいのかな。
name: imagebuilder on: [push] jobs: imagebuild: name: image build on github runs-on: windows-2019 steps: - name: Checkout repo uses: actions/checkout@v2 - name: Install PowerCLI run: | Install-Module VMware.PowerCLI -Scope CurrentUser -Force shell: powershell - name: Build Image run: New-IsoImage ` -Depots ` "https://hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xml" ` -SoftwareSpec ` ".\spec.json" ` -KernelOptions ` "systemMediaSize=min" ` -Destination ` ".\VMware-VMvisor-Installer-7.0U3c-19193900.x86_64.customized.iso" shell: powershell - name: Upload artifact uses: actions/upload-artifact@v2 with: name: ESXi Image path: VMware-VMvisor-Installer-7.0U3c-19193900.x86_64.customized.iso
New-IsoImage に与えるspec.json
はそのまま github に入れてしまえば OK。
(パスは適時いい感じに)
{ "base_image": { "version": "7.0.3-0.20.19193900" } }
リポジトリのファイル配置はこんな感じに。
$ tree -a ./ -I .git # .git/ 下は非表示 ./ ├── .github │ └── workflows │ └── imagebuilder.yaml └── spec.json
on [push]
で指定しておくことで、 push をトリガーにワークフローが動き出す。
Github Actions を見守る
push 後は Github の WebUI から成り行きを見守る。
とにかく PowerCLI のインストールが一時間とやたら時間がかかる…
【小一時間経過。。。】
ワークフローが成功で完了。
Summary ページに生成されたイメージが Artifacts としてアップロードされる。
とりあえずカスタムイメージは作れそうだけど
Github Actions 使えば Windows 環境が手元になくてもカスタムイメージ作成は可能。
オフラインバンドル形式での作成も cmdlet 差し替えればいけそう。
が、若干悩ましいのが、ホームラボユーザに需要が高そうな Community Network Driver…
公式 Driver や Addon であれば公開リポジトリがあり、New-IsoImage
cmdlet でダウンロードまでカバーしてくれるが、Community Network Driver は flings 上であるためリポジトリが無さげ。
zip でダウンロードして Github 上 push してしまえばいけそうではあるけど、バイナリを push するのはあまりキレイではないよなぁ…う~ん
注意
ビルドしたイメージですが、public リポジトリでコレをやると生成されたイメージも public で公開されてしまうわけで…
(ライセンス条項ちゃんと読んでないけど)イメージ再配布は色々まずいかもということで、リポジトリ公開範囲としては private リポジトリにしておいた方が無難。
この辺、詳しい人いましたら情報ください。。。mm
2022/3/14 0:32 追記
Twitter で @kurokobo さんよりコメントいただきました。
なるほど…これは効果ありそう。あ、あと、Install-Module でつっこむのを "VMware.ImageBuilder" だけにすると劇的に早くなりそうな気がします!
— くろい (@kurokobo) 2022年3月13日
修正
Install-Module
を VMware.ImageBuilder
モジュールにするだけ。
name: imagebuilder on: [push] jobs: imagebuild: name: image build on github runs-on: windows-2019 steps: - name: Checkout repo uses: actions/checkout@v2 - name: Install PowerCLI run: | Install-Module VMware.ImageBuilder -Scope CurrentUser -Force shell: powershell - name: Build Image run: New-IsoImage ` -Depots ` "https://hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xml" ` -SoftwareSpec ` ".\spec.json" ` -KernelOptions ` "systemMediaSize=min" ` -Destination ` ".\VMware-VMvisor-Installer-7.0U3c-19193900.x86_64.customized.iso" shell: powershell - name: Upload artifact uses: actions/upload-artifact@v2 with: name: ESXi Image path: VMware-VMvisor-Installer-7.0U3c-19193900.x86_64.customized.iso
結果
小一時間かかっていた PowerCLI インストールが 5 分もかからず終わった…早っ!
カスタムイメージ作成だけなので、これで十分ですね。