【PowerCLI】テスト用仮想マシンをコマンドでテンプレートから複製しまくる

どうも、Tです。

vSphere環境上にテスト用の仮想マシンを作成する際に、vSphere Client上からマウスでポチポチやっていましたが、さすがに面倒になってきたのでPowerCLIのコマンドを実行して複数台をサクッと作りたいと思ったので備忘録です。

やりたいこと

PowerCLIを使ってvSphere環境上に以下を指定して仮想マシンをいっぱい作りたい。

  1. 仮想マシン名
  2. 仮想マシンを作成する場所(仮想マシンフォルダ)
  3. 作成先のESXiホスト
  4. 作成先のデータストア
  5. 仮想マシンのディスクフォーマット
  6. 仮想マシンのポートグループ(標準スイッチ)
  7. ゲストOSのカスタマイズを使用する

環境

以下の環境で試しています。

  • vCenter 8.0.2, 22385739
  • ESXi 8.0.1, 21495797
  • PowerCLI 13.2.1 build 22851661
  • テンプレートで複製する仮想マシンはWindows11

PowerCLI参考

PowerCLIのインストール方法

vSphere7環境をコマンド操作するためにVMware PowerCLIを使ってみる
どうも、Tです。 vSphere環境をコマンドでごにょごにょする仕事がありそうなのでPowerCLIインストールしてみました。...
【PowerCLI】オフラインインストール
どうも、Tです。 以前PowerCLIをインストールしましたが、PowerShellギャラリー(インターネット経由)を利用した方法でし...

PowerCLIからvCenterに接続する方法

【PowerCLI】vCenter・ESXiに接続する
どうも、Tです。 Power CLIを使ってvCenter・ESXiへ接続してみます。 共通問題 下記のようなエラーが出る...

PowerCLIコマンド

以下のvCenter接続情報(入力値)・複製情報(入力値) の変数に値を入力して、コピペしたものをPower Shell上で実行するとテンプレートから仮想マシンが複製されます。

### vCenter接続情報(入力値) #####################################################
$VI_SERVER = '<vCenterのFQDN or IPアドレス>'        # vCenterのFQDN or IPアドレス。例:k-vc.k.local.lab
$VI_USER = 'Administrator@vsphere.local'           # 接続アカウント。例:Administrator@vsphere.local
$VI_PASSWORD = '<パスワード>'                       # 接続アカウントパスワード。

### 複製情報(入力値) ############################################################
$VM_NUM= '<展開する仮想マシン台数>'                     # 複製する仮想マシンの台数。例:5
$VM_PREFIX = '<仮想マシン名プレフィックス>'             # 仮想マシン名のプレフィックス。 例:clone-test-
$VM_TEMPLATE = '<テンプレート仮想マシン名>'             # テンプレート仮想マシンの名前。例:tpl-vm
$VM_CUTOM_SPEC = '<仮想マシンカスタマイズ仕様書の名前>'  # 仮想マシンカスタマイズ仕様書の名前。例:Windows-Client
$VM_HOST = '<展開先のESXiのFQDN or IP>'                # 展開先のESXiのFQDN or IPアドレス。例:k-sv01.k.local.lab
$VM_DATASTORE = '<展開先のデータストア名>'              # 展開先のデータストア名。例:k-sv01_ssd2
$VM_DISK_FORMAT = '<仮想マシンのディスクタイプ>'        # 仮想マシンのディスクタイプ(Thin or Thick or EagerZeroedThick)。例:Thin
$VM_NETWORK = '<仮想マシンポートグループ名>'            # 接続先の仮想マシンポートグループ名。例:VM Network
$VM_FOLDER = '<仮想マシンフォルダ名>'                   # 仮想マシンフォルダ名。例:testfolder

### 複製処理 ####################################################################
# vCenter接続 
Connect-VIServer -Server $VI_SERVER -User $VI_USER -Password $VI_PASSWORD -force

# テンプレートから複製
for($cnt = 1; $cnt -le $VM_NUM; $cnt++){
    $VMName = $VM_PREFIX+$cnt
    $VMfolder = (Get-Folder $VM_FOLDER | Select-Object -first 1)
    
    #仮想マシンクローン処理
    New-VM -Name "$VMName" `
    -VMHost "$VM_HOST" `
    -OSCustomizationSpec "$VM_CUTOM_SPEC" `
    -Template "$VM_TEMPLATE" `
    -Datastore "$VM_DATASTORE" `
    -DiskStorageFormat "$VM_DISK_FORMAT" `
    -NetworkName "$VM_NETWORK" `
    -Location $VMfolder

    # 仮想マシンのパワーオン
    Start-VM -VM $VMName
}

# vCenter切断
Disconnect-VIServer -Server $VI_SERVER -Confirm:$False

上記を実行すると指定の仮想マシンフォルダに「$VM_PREFIX-1」から連番になった仮想マシンが作成、パワーオンされます。そのあとは、カスタマイズ仕様書に沿った動作でカスタマイズされます。

このスクリプトの注意点

このスクリプトでいくつか注意事項があるので記載。

同名の仮想マシンフォルダがある場合

仮想マシンフォルダは、階層構造になっている場合に同じ名前のフォルダを作成できます。$VM_FOLDERで仮想マシンフォルダを指定していますが、同じ名前のフォルダがある場合、どこに配置されるかわかりません。

階層構造になっている場合に簡単に指定できるオプションがないため、一番最初に引っかかったフォルダ先になります。

このフォルダもIDを持っているため、スクリプトを作りこめば制御できそうですが、個人的に必要ないので諦めました。

TPMプロビジョニングポリシーの指定

vSphere ClientでWindows 11などのテンプレートから仮想マシンのプロビジョニングをするとTPMプロビジョニングポリシーの選択ができますが、このスクリプトではできずデフォルトの「コピー」でデプロイされます。

以下の「暗号化された仮想マシンのクローン」のドキュメントを見ているとできそうでしたが、PowerCLIのリファレンスに明確なオプションを見つけられませんでした。

暗号化された仮想マシンのクローン
暗号化された仮想マシンのクローンは、キーを変更しない限り同じキーで暗号化されます。キーを変更するには、vSphere Client、PowerCLI、または API を使用します。PowerCLI または API を使用すると、1 回の手順で暗号化された仮想マシンのクローンを作成してキーを変更できます。

キーを変更するには、vSphere ClientPowerCLI、または API を使用します。

ただ、詳細オプションでデフォルトを「置き換え」に変更できるようなので、「置き換え」が必要な場合は、仮想マシンテンプレートの詳細オプションを設定しておくとよさそうです。

注:vSphere 8.0 以降には vpxd.clone.tpmProvisionPolicy という詳細設定が含まれていて、vTPM のデフォルトのクローン作成動作を「置き換え」に設定することができます。

その他

他にも細かい注意点です。

仮想分散スイッチには非対応です。仮想分散スイッチの場合、New-VMコマンドで指定するオプションが異なってきます。

1台ずつデプロイするため動作は遅いです(手動でやるよりは早いですが…)。

今回、ESXiホストを指定していますが、DRSが有効な場合はクラスタを指定するほうが良いでしょう(New-VMコマンドのオプションが異なってきます)。

IPは設定していません。New-VMコマンドIPアドレスの設定はできないためデプロイした後にPowerCLIで設定する必要があります。個人的に大量でデプロイするときは、DHCP使ってるので作りませんでした。

参考

New-VM Command | Vmware PowerCLI Reference
This cmdlet creates a new virtual machine with the provided parameters. The network adapter and the Small Computer System Interface (SCSI) adapter of the new vi...

まとめ

半日くらい潰れたけど、これで多少は無駄な労力減るので良い…かな…。