前言
簡單來說,有個建立多個 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"
}