URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

多数の仮想マシンに固定IPアドレスを割り当てながらプロビジョニングするスクリプト

 今年もあまり技術的なことには触れられなかったけど、最後なので最近やったことから1つくらい残しておこうかと。

 vSphere環境でテンプレートから仮想マシンを展開する際、IPアドレスは手動で設定することも多々あります。
 少数ならそれで問題ないのですが、多数の仮想マシンを一気に展開する場合はさすがに手動では手間というか無駄が多いので自動で設定していきます。

 特に目新しいことをするわけではないですが、仕事的にそこそこ使う機会が多いので自分用のメモです。

 前提条件は以下の通りです。

  • vSphereによる仮想化環境
  • 仮想マシンテンプレートを元に仮想マシンを展開していく
  • ゲストOSはWindowsを想定
  • vSphereのカスタマイズ仕様を用いる
  • PowerShell及びVMware PowerCLIを用いる
  • ホスト名とIPアドレスの対応はCSVファイルで与え、フォーマットは以下の通り
Name,IpAddress vm01,192.168.0.11 vm02,192.168.0.12 vm03,192.168.0.13

 スクリプトは以下の通りです。

# Import VM List file $ListFile = "C:\Temp\vmlist.csv" $VmList = Import-Csv $ListFile # vSphere Resource $VcServer = "vc.example.com" $EsxHost = "esx.example.com" $Template = "vm-template" $SpecName = "Spec-Windows" $Store = "Shared-Vol" $FolderName = "Servers" # Authentication $VcAdmin = "Administrator@vsphere.local" $VcPasswd = "password" # Common Networking $NetMask = "255.255.255.0" $DefaultGw = "192.168.0.254" $Dns = "192.168.0.1" Import-Module VMware.PowerCLI $Res = Connect-VIServer -Server $VcServer -User $VcAdmin -Password $VcPasswd $VmFolder = Get-Folder -Name $FolderName foreach ($TargetVm in $VmList) { $VmName = $TargetVm.Name $VmIpaddr = $TargetVm.IpAddress $TempSpec = "$VmName-Temp" $Res = Get-OSCustomizationSpec -Name $SpecName | New-OSCustomizationSpec -Name $TempSpec -Type NonPersistent $Res = Get-OSCustomizationNicMapping $TempSpec | Set-OSCustomizationNicMapping -IpMode UseStaticIP -IpAddress $VmIpaddr -SubnetMask $NetMask -DefaultGateway $DefaultGw -Dns $Dns Start-Sleep 3 $Res = New-VM -Name $VmName -VMHost $EsxHost -Template $Template -OSCustomizationSpec $TempSpec -Datastore $Store -Location $VmFolder Start-Sleep 3 $Res = Get-VM -Name $VmName | New-VTpm Start-Sleep 1 Start-VM -VM $VmName } Disconnect-VIServer -Confirm:$false exit

 "Import-Csv"でCSVを読み込み、"foreach"で回していく単純な動きです。
 ホスト名やIPアドレスの設定はカスタマイズ仕様の仕組みを利用していて、事前作成していたカスタマイズ仕様を元に"New-OSCustomizationSpec -Type NonPersistent"で一時カスタマイズ仕様を作成、一時カスタマイズ仕様のネットワーク設定を"Set-OSCustomizationNicMapping"で固定IPアドレスに修正、"New-VM"で適用するという流れを繰り返していきます。
 今回は1台のESXiホスト上に全仮想マシンを展開していますが、現実的には"New-VM"のオプション"-VMHost"は"-ResourcePool"にしてクラスタやリソースプールに分散して展開するのがよいかと思います。
 最後の方にある"New-VTpm"は、最近の仕事で展開したゲストOSがWindows 11だったためシステム要件でvTPMが必要だったからですね。このあたりも環境次第で。

 今の会社はこういった単純作業の繰り返しを何も考えずに手作業でやろうとする人が多いのですよね。私は少しでも作業量を減らす方法を考えることに時間を使いたいタイプです。