vHoge

VMwareのアレコレ備忘録。CLIでがんばるネタ多め。

Github Actions で ESXi カスタムイメージを作る

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 のワークフローを動かすには以下の流れ。

  1. リポジトリを作成
  2. .github/workflows ディレクトリ化にワークフロー用の yaml を書く
  3. git commitgit pushなりでワークフローを動かす

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 から成り行きを見守る。
f:id:masahiroirie:20220313214427p:plain f:id:masahiroirie:20220313214514p:plain とにかく PowerCLI のインストールが一時間とやたら時間がかかる…

【小一時間経過。。。】

ワークフローが成功で完了。
f:id:masahiroirie:20220313225433p:plain Summary ページに生成されたイメージが Artifacts としてアップロードされる。
f:id:masahiroirie:20220313225510p:plain

とりあえずカスタムイメージは作れそうだけど

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-ModuleVMware.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 分もかからず終わった…早っ!
カスタムイメージ作成だけなので、これで十分ですね。
f:id:masahiroirie:20220314002956p:plain