PowerShell批量部署Hyper-VWindows虚机
第一步:制作模板VHDX文件(略); 第二步:制作初始化系统脚本(自动设置IP、GW等); 将以下2个脚本放置到模板VHDX中的C:\Windows\Setup\Scripts目录下: 第1个脚本:FirstRun.ps1 #获取计算机名称 $VMname=hostname #根据计算机名称获取IP地址后6位 [int]$IP1=$VMname.Substring($VMname.Length - 6,3) [int]$IP2=$VMname.Substring($VMname.Length - 3,3) #设定FSNNetwork $IPaddr1=$IPaddr1='172.1.' + $IP1 + '.' + $IP2 New-NetIPAddress -InterfaceIndex 12 -IPAddress $IPaddr1 -PrefixLength 16 -DefaultGateway 172.1.0.250 Set-DNSClientServerAddress -InterfaceIndex 12 -ServerAddresses ("172.1.0.1","172.1.0.2") exit 第2个脚本:SetupComplete.cmd (该脚本名称必须为SetupComplete) Powershell -Command "C:\Windows\Setup\Scripts\'FirstRun.ps1'" timeout 3 gpupdate /force cd C:\Windows\System32 wuauclt.exe /DetectNow /UpdateNow ::cd C:\FalconAgent ::falcon-agent.exe -service install ::sc.exe config falconagent Start=delayed-auto ::falcon-agent.exe -service start del C:\Windows\Setup\Scripts\FirstRun.ps1 del %0 第三步:创建自动化部署脚本 # ================================ # # Create-VM_V1.0(Windows).PS1 # # 通过PowerShell创建Hyper-V虚机 # # ================================ # #Param($VM_Name,$VM_HostName) Write-Host -NoNewline -ForegroundColor Magenta '请输入要创建的虚机名称(如:VWSR******)' [String]$VM_Name = Read-Host Write-Host -NoNewline -ForegroundColor Magenta '请输入需要放在哪台宿主机上(如:PWSR******)' [String]$VM_HostName= Read-Host Write-Host -NoNewline -ForegroundColor Magenta '要部署App Server还是SQL Server?默认App Server回车即可(如:sql 回车或者2 回车)' [String]$VM_OSClass= Read-Host #判断虚机名称是否为大写字母 if ($VM_Name |findstr 'vwsr') { Write-Host -NoNewline -ForegroundColor Yellow '注意:虚机名需要使用大写字母!!!' break } Else { } $VM_Memory= 4GB $VM_CpuCount= 4 $Owner= "IT" $Org= "sxleilong.com" $NetworkSwitch= "FSNNetwork" #$AdminPassword = "Administrator Password" $SourcePath= "D:\VM_Deploy_Script" $DjoinSource= $SourcePath + '\' + $VM_Name +'.txt' #if判断要部署App Server还是SQL Server,默认是App Server if (($VM_OSClass -eq '2') -or ($VM_OSClass -eq 'sql') -or ($VM_OSClass -eq 'SQL')) {$Template_VHDX= $SourcePath + '\' + 'En_WinSrv12R2_For_SQL.vhdx' Write-Host -ForegroundColor Green "您选择安装SQL虚机!!!" } Else {$Template_VHDX= $SourcePath + '\' + 'En_WinSrv12R2_For_APP.vhdx' Write-Host -ForegroundColor Green "您选择安装App虚机!!!" } #if判断如果虚机所在宿主机为管理系,虚机文件存放位置为E盘 if (( $VM_HostName -eq 'PWSR252001' ) -or ($VM_HostName -eq 'PWSR252002' )) { $VM_Path = 'E:\' + $VM_HostName + '_E_VMs' $VM_RemotePath = '\\' + $VM_HostName + '\E$\' + $VM_HostName + '_E_VMs' } Else { $VM_Path = 'D:\' + $VM_HostName + '_D_VMs' $VM_RemotePath = '\\' + $VM_HostName + '\D$\' + $VM_HostName + '_D_VMs' } $VM_VHDPath = $VM_Path + '\' + $VM_Name + '\Virtual Hard Disks\'+ $VM_Name + '.vhdx' $VM_VHDRemotePath = $VM_RemotePath + '\' + $VM_Name + '\Virtual Hard Disks\' + $VM_Name + '.vhdx' #if判断是否为0系管理服务器,用以自动加入不同OU if ($VM_Name |findstr 'VWSR000' ) { $VM_MachineOU= "OU=MgmtServers,OU=sxleilong,DC=sxleilong,DC=cn" } Else { $VM_MachineOU= "OU=NewInfra,OU=Production Servers,OU=sxleilong,DC=sxleilong,DC=cn" } #编辑应答文件模板 $UnattendTemplate= "Unattend-template.xml" $Unattendfile= New-Object XML $Unattendfile.Load($SourcePath+"\"+$UnattendTemplate) $Unattendfile.unattend.settings.component[2].ComputerName=$VM_Name $Unattendfile.unattend.settings.component[2].RegisteredOrganization=$Org $Unattendfile.unattend.settings.component[2].RegisteredOwner=$Owner $Unattendfile.unattend.settings.Component[3].RegisteredOrganization=$Org $Unattendfile.unattend.settings.Component[3].RegisteredOwner=$Owner #$UnattendFile.unattend.settings.component[3].UserAccounts.AdministratorPassword.Value=$AdminPassword #$UnattendFile.unattend.settings.component[3].autologon.password.value=$AdminPassword $UnattendXML=$SourcePath+"\"+$VM_Name+".xml" $Unattendfile.save($UnattendXML) #Mount模板VHDX Mount-diskp_w_picpath $Template_VHDX $DriveLetter=((Get-DiskImage $Template_VHDX | get-disk | get-partition | Where-Object Type -eq "Basic").DriveLetter)+":" #注入Unattend.xml文件到VHDX中 $UnattendXml_Destination=$Driveletter+"\Windows\System32\Sysprep\unattend.xml" Copy-Item $UnattendXml $UnattendXml_Destination -Force #生成Offline JoinDomain文件 Djoin /Provision /Domain sxleilong.com /Machine $VM_Name /MachineOU $VM_MachineOU /Savefile $DjoinSource /Reuse #注入Offline JoinDomain文件,并移除历史DjoinFile $DjoinDestination= $Driveletter+'\Windows' $His_DjoinFile= $DjoinDestination +'\'+'VWSR*.txt' Remove-Item -Path $His_DjoinFile -Force Copy-Item $DjoinSource $DjoinDestination -Force Djoin /RequestODJ /Loadfile "$VM_Name.txt" /WindowsPath $DjoinDestination /LocalOS #注入开机运行脚本 $ScriptFolder=$DriveLetter+"\Windows\Setup\Scripts\" $Scriptname=$Scriptfolder+"FirstRun.ps1" If (Test-Path $ScriptFolder) {} Else { New-Item $ScriptFolder -ItemType Directory Copy-Item "$SourcePath\Scripts\*" $ScriptFolder -Force } #DisMount模板VHDX dismount-diskp_w_picpath $Template_VHDX #Remove应答文件和Djoin文件 Remove-Item -Path $DjoinSource Remove-Item -Path $UnattendXml #Copy虚拟机VHDX文件 New-item -path $VM_RemotePath\$VM_Name -name "Virtual Hard Disks" -ItemType directory Copy-Item -Path $Template_VHDX -Destination $VM_VHDRemotePath #新建虚机 New-VM –Name $VM_Name -ComputerName $VM_HostName –Generation 2 -MemoryStartupBytes $VM_Memory -SwitchName $NetworkSwitch –Path $VM_Path -VHDPath $VM_VHDPath #设置CPU个数 Set-VM -Name $VM_Name -ComputerName $VM_HostName -ProcessorCount $VM_CpuCount #禁用动态内存功能 #Set-VMMemory -Name $VM_Name -ComputerName $VM_HostName -DynamicMemoryEnabled $False #添加DVDDrive Get-VM -Name $VM_Name -ComputerName $VM_HostName |Add-VMDvdDrive -ControllerNumber 0 #设置VLANID #Set-VMNetworkAdapterVlan -ComputerName $VM_HostName -VMName $VM_Name -Access -VlanId 1112 #通过SCVMM分配静态MACAddress #Import-Module virtualmachinemanager Read-SCVMHost -VMHost $VM_HostName |Out-Null $VM=Get-SCVirtualMachine -Name $VM_Name $Adapter=$VM.VirtualNetworkAdapters[0] Set-SCVirtualNetworkAdapter -VirtualNetworkAdapter $Adapter[0] -MACAddressType "Static" -MACAddress "00-00-00-00-00-00" |Out-Null #启动虚机 #Start-VM -Name $VM_Name -ComputerName $VM_HostName Start-SCVirtualMachine -VM $VM_Name
文章标题:PowerShell批量部署Hyper-VWindows虚机
本文链接:http://cdiso.cn/article/gdseci.html