PowerShell - 迴圈建立 VM 虛擬主機

前言

簡單來說,有個建立多個 VM 虛擬主機的大量部署需求,所以這篇筆記就誕生了。

PowerShell 內容及概要說明
  • $VM_Path: 指定產生的 VM 虛擬主機的存放路徑
  • $VM_vCPU: 指定產生的 VM 虛擬主機 vCPU 數量。
  • $VM_MaxIOPS: 指定產生的 VM 虛擬主機最大 IOPS 數值。此實作環境中,為避免迴圈建立 VM 虛擬主機造成大量的 IOPS,所以限制每台 VM 虛擬主機最多只能使用 50 IOPS。
  • $HV_Host: 抓取目前執行此 PowerShell Script 的 Hyper-V Host 電腦名稱當成變數。
  • $HV_vSwitch: 指定產生的 VM 虛擬主機,屆時要接在哪一台 Virtual Switch
  • $HV_WSFC: 指定產生的 VM 虛擬主機,屆時要加入哪個 Hyper-V Failover Cluster
  • Options1: 先建立個範本 VM(Bash_VM.vhdx),用它來部署大量的 VM 虛擬主機。
  • Options2: 建立空的硬碟檔案,並建立 VM 虛擬主機。
  • 指定 vRAM 空間: 指定 VM 虛擬主機的 vRAM 空間。
  • 啟動 VM 並加入 Cluster: 最後,啟動 VM 虛擬主機並加入指定的 Hyper-V Cluster。


PowerShell 指令碼內容
$VM_Path = "C:\ClusterStorage\Volume1"
$VM_vCPU = "2"
$VM_MaxIOPS = "50"
$HV_Host = "$env:computername"
$HV_vSwitch = "HV_vNetwork"
$HV_WSFC = "QCB-Node-FC"

#Setting Hyper-V Host VM Configuration File path
if (!(Test-Path -Path "$VM_Path\VMs_Config")) {
    New-Item -Path "$VM_Path\VMs_Config" -ItemType "Directory"
    Set-VMHost -VirtualMachinePath "$VM_Path\VMs_Config"
}

foreach ($i in 1..1) {
#Create the necessary folders
if (!(Test-Path -Path "$VM_Path\$HV_Host\$HV_Host-VM$i")) {
    New-Item -Path "$VM_Path\$HV_Host\$HV_Host-VM$i" -ItemType "Directory"
}

#Option1 - Copy Bash VHDX & Create template VM
Copy-Item "$VM_Path\Bash_VM.vhdx" "$VM_Path\$HV_Host\$HV_Host-VM$i\$HV_Host-VM$i.vhdx"

New-VM -Name "$HV_Host-VM$i" -VHDPath "$VM_Path\$HV_Host\$HV_Host-VM$i\$HV_Host-VM$i.vhdx" -Generation 2 -SwitchName "$HV_vSwitch"

#Option2 - Create empty VM
#New-VM -Name "$HV_Host-VM$i" -NewVHDPath "$VM_Path\$HV_Host\$HV_Host-VM$i.vhdx" -NewVHDSizeBytes 50GB  -Generation 2 -SwitchName "S2S-vSwitch"

#Configure Disk IOPS
Set-VMHardDiskDrive -VMName "$HV_Host-VM$i" -MaximumIOPS "$VM_MaxIOPS"

#Configure VM vCPU Count
Set-VMProcessor -VMName "$HV_Host-VM$i" -Count "$VM_vCPU"

#Configure VM Dynamic Memory
Set-VMMemory -VMName "$HV_Host-VM$i" -DynamicMemoryEnabled $True -MaximumBytes 4GB -MinimumBytes 512MB -StartupBytes 2GB

#Power On the VM
Start-VM "$HV_Host-VM$i"

#Add the VM to the cluster
Add-ClusterVirtualMachineRole -Cluster "$HV_WSFC" -VMName "$HV_Host-VM$i"
}