Windows/Powershell/Hyper V
From r00tedvw.com wiki
(Difference between revisions)
Line 154: | Line 154: | ||
#Get-Variable | ForEach-Object { $_.Name } | #Get-Variable | ForEach-Object { $_.Name } | ||
ClearVariables</nowiki> | ClearVariables</nowiki> | ||
+ | |||
+ | ==scvmm install vm== | ||
+ | WIP, script to create virtual machines on a SCVMM host using templates. | ||
+ | <nowiki>param( | ||
+ | [parameter(ParameterSetName="createvm")][int64]$Epoch = [long](Get-Date -Date ((Get-Date).ToUniversalTime()) -UFormat %s), | ||
+ | [parameter(ParameterSetName="createvm")][ValidateSet('LAB-ENG Template','LAB-ENGINEERING TEMPLATE','LAB-CENTOS7','LAB-WIN2K16')][string]$TemplateName = "LAB-CENTOS7", | ||
+ | [parameter(ParameterSetName="createvm")][string]$VMName = -join($TemplateName, "-", $Epoch), | ||
+ | [parameter(ParameterSetName="createvm")][string]$Description = "GVE Test VM $BaseImage created on $( Get-Date )", | ||
+ | [parameter(ParameterSetName="createvm")][ValidateSet('AlwaysAutoTurnOnVM','NeverAutoTurnOnVM','TurnOnVMIfRunningWhenVSStopped')][string]$StartAction = "AlwaysAutoTurnOnVM", | ||
+ | [parameter(ParameterSetName="createvm")][ValidateSet('SaveVM','ShutdownGuestOS','TurnOffVM')][string]$StopAction = "TurnOffVM", | ||
+ | [parameter(ParameterSetName="createvm")][string]$SCVMMServer = "scvmm1.r00tedvw.com", | ||
+ | [parameter(ParameterSetName="createvm")][string]$sccloud = "LAB-ENG", | ||
+ | [parameter(ParameterSetName="createvm")][string]$LogDir = "C:\logs", | ||
+ | [parameter(ParameterSetName="createvm")][string]$UserRoleName = "ENG Users" | ||
+ | ) | ||
+ | |||
+ | #Creates a new Virtual Machine from a Template | ||
+ | function CreateVM { | ||
+ | $template = (Get-SCVMTemplate -VMMServer $SCVMMServer | Where-Object {$_.Name -eq $TemplateName}) | ||
+ | $Cloud = (Get-sccloud | Where-Object {$_.Name -eq $sccloud}) | ||
+ | $virtualmachineconfiguration = (New-SCVMConfiguration -Cloud $Cloud -VMTemplate $Template -Name $VMName) | ||
+ | if ($VMName -like "*WIN2K16*") { | ||
+ | $OperatingSystem = "Windows Server 2016 Standard" | ||
+ | } elseif ($VMName -like "*WIN2K12*") { | ||
+ | $OperatingSystem = "Windows Server 2012 Standard" | ||
+ | } elseif ($VMName -like "*centos*") { | ||
+ | $OperatingSystem = "CentOS Linux 7 (64 bit)" | ||
+ | } else { | ||
+ | $OperatingSystem = "Other (64 bit)" | ||
+ | } | ||
+ | |||
+ | New-SCVirtualMachine -Name $VMName ` | ||
+ | -VMConfiguration $VirtualMachineConfiguration ` | ||
+ | -Cloud $Cloud ` | ||
+ | -Description $Description ` | ||
+ | -StartAction $StartAction ` | ||
+ | -StopAction $StopAction ` | ||
+ | -OperatingSystem $OperatingSystem ` | ||
+ | -ErrorAction Stop | ||
+ | } | ||
+ | |||
+ | #Verify that the desired Computer Name does not already exist | ||
+ | function ValidateName { | ||
+ | Get-SCVirtualMachine -VMMServer $SCVMMServer -ErrorAction Stop | ForEach-Object { | ||
+ | if ($_.VMName -eq $VMName) { | ||
+ | $script:LogOut = "$(Get-Date) - Failed to create the VM with the name: $VMName. A VM already exists with that name." | ||
+ | exit | ||
+ | } | ||
+ | else { | ||
+ | return | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | #Verify Log directory exists and create if not | ||
+ | function VerifyLogDir { | ||
+ | if( -Not (Test-Path -Path $LogDir ) ) { | ||
+ | New-Item -ItemType directory -Path $LogDir -ErrorAction Stop | ||
+ | } | ||
+ | } | ||
+ | |||
+ | #Grant Role to vm | ||
+ | function GrantRole { | ||
+ | Grant-SCResource -VMMServer $SCVMMServer -UserRoleName $UserRoleName -Resource $(Get-SCVirtualMachine -VMMServer $SCVMMServer -Name $VMName) -ErrorAction Stop | ||
+ | } | ||
+ | |||
+ | #Delete VM | ||
+ | function DeleteVM { | ||
+ | Remove-SCVirtualMachine -VM $( Get-SCVirtualMachine -VMMServer $SCVMMServer -Name $VMName ) -ErrorAction Stop | ||
+ | } | ||
+ | |||
+ | #Set-PSDebug -Off | ||
+ | #Set-PSDebug -Trace 2 | ||
+ | |||
+ | #Validate the Name and Log Directory, Create the VM | ||
+ | try { | ||
+ | ValidateName | ||
+ | VerifyLogDir | ||
+ | CreateVM | ||
+ | $script:LogOut = "$(Get-Date) - Created VM $VMName" | ||
+ | } | ||
+ | catch { | ||
+ | $ErrorMessage = $_.Exception.Message | ||
+ | $script:LogOut = "$(Get-Date) - Failed to create the VM $VMName. The error message was $ErrorMessage" | ||
+ | Break | ||
+ | } | ||
+ | finally { | ||
+ | echo $script:LogOut | Out-File $LogDir\vm-script.log -Append | ||
+ | } | ||
+ | |||
+ | #Configure the VM and Start | ||
+ | try { | ||
+ | GrantRole | ||
+ | Start-SCVirtualMachine -VM $( Get-SCVirtualMachine -VMMServer $SCVMMServer -Name $VMName ) | ||
+ | $script:LogOut = "$(Get-Date) - Granted access for $UserRoleName to $VMName `n$(Get-Date) - Operating System for $VMName is $( | ||
+ | if ($VMName -like "*WIN2K16*") { | ||
+ | echo "Windows Server 2016 Standard" | ||
+ | } elseif ($VMName -like "*WIN2K12*") { | ||
+ | echo "Windows Server 2012 Standard" | ||
+ | } elseif ($VMName -like "*centos*") { | ||
+ | echo "CentOS Linux 7 (64 bit)" | ||
+ | } else { | ||
+ | echo "Other (64 bit)" | ||
+ | } | ||
+ | )" | ||
+ | } | ||
+ | catch { | ||
+ | $ErrorMessage = $_.Exception.Message | ||
+ | $script:LogOut = "$(Get-Date) - Failed to configure the VM $VMName, deleting. The error message was $ErrorMessage" | ||
+ | Stop-SCVirtualMachine -VM $( Get-SCVirtualMachine -VMMServer $SCVMMServer -Name $VMName ) -ErrorAction SilentlyContinue | ||
+ | DeleteVM | ||
+ | } | ||
+ | finally { | ||
+ | echo $script:LogOut | Out-File $LogDir\vm-script.log -Append | ||
+ | }</nowiki> |
Revision as of 17:25, 5 February 2019
Contents |
Install
To Install the Hyper-V Powershell Module (Done on Windows 10 client)
PS> Get-WindowsOptionalFeature -Online -FeatureName *hyper-v* | select DisplayName, FeatureName DisplayName FeatureName ----------- ----------- Hyper-V Microsoft-Hyper-V-All Hyper-V Platform Microsoft-Hyper-V Hyper-V Management Tools Microsoft-Hyper-V-Tools-All Hyper-V Module for Windows PowerShell Microsoft-Hyper-V-Management-PowerShell Hyper-V Hypervisor Microsoft-Hyper-V-Hypervisor Hyper-V Services Microsoft-Hyper-V-Services Hyper-V GUI Management Tools Microsoft-Hyper-V-Management-Clients PS> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Management-PowerShell Path : Online : True RestartNeeded : False
Scripts
Clone VM
Quick script to clone a VM based on an existing "master".
issues with this method will be duplication of VM values, such as hostname, sid, etc. If using an Evaluation copy of windows, when the master expires, the clones wont work anymore, so rebuilding the master every 6 months is needed.
Also, this uses VHD differencing, so the master cannot be powered on or it will break the rest of the vms created off it.
param( [parameter(ParameterSetName="createvm")][int64]$Epoch = [long](Get-Date -Date ((Get-Date).ToUniversalTime()) -UFormat %s), [parameter(ParameterSetName="createvm")][ValidateSet('Win2k16-Master','Win2k12r2-Master','Win2k16GVEUpgrade-Master','Win2k12r2GVEUpgrade-Master','Linux-Master')][string]$BaseImage = "Linux-Master", [parameter(ParameterSetName="createvm")][string]$ComputerName = "win-45mo0eqvg4g", [parameter(ParameterSetName="createvm")][string]$Name = -join($BaseImage, "-", $Epoch), [parameter(ParameterSetName="createvm")][string]$Path = "C:\ProgramData\Microsoft\Windows\Hyper-V\", [parameter(ParameterSetName="createvm")][string]$NewVHDPath = "C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\$Name.vhdx", [parameter(ParameterSetName="createvm")][string]$NewVHDSizeBytes = 20GB, [parameter(ParameterSetName="createvm")][int]$Generation = 1, [parameter(ParameterSetName="createvm")][string]$MemoryStartupBytes = 1GB, [parameter(ParameterSetName="createvm")][string]$SwitchName = "External_Virtual_Switch_01", [parameter(ParameterSetName="createvm")][int]$ProcessorCount = 1, [parameter(ParameterSetName="createvm")][int64]$MemoryMinimumBytes = 1073741824, [parameter(ParameterSetName="createvm")][int64]$MemoryMaximumBytes = 2147483648, [parameter(ParameterSetName="createvm")][string]$AutomaticStartAction = "Nothing", [parameter(ParameterSetName="createvm")][int]$AutomaticStartDelay = 1, [parameter(ParameterSetName="createvm")][string]$AutomaticStopAction = "Shutdown", [parameter(ParameterSetName="createvm")][string]$Date = (Get-Date), [parameter(ParameterSetName="createvm")][string]$Notes = "Created $Date", [parameter(ParameterSetName="createvm")][string]$LogDir = "C:\logs" ) #Creates a new Virtual Machine function CreateVM { New-VM -ComputerName $ComputerName ` -Name $Name ` -Path $Path ` -VHDPath $newVHDPath ` -Generation $Generation ` -MemoryStartupBytes $MemoryStartupBytes ` -SwitchName $SwitchName } #Configures the new Virtual Machine function ConfigureVM { Set-VM -ComputerName $ComputerName ` -Name $Name ` -ProcessorCount $ProcessorCount ` -DynamicMemory ` -MemoryMinimumBytes $MemoryMinimumBytes ` -MemoryMaximumBytes $MemoryMaximumBytes ` -AutomaticStartAction $AutomaticStartAction ` -AutomaticStartDelay $AutomaticStartDelay ` -AutomaticStopAction $AutomaticStopAction ` -Notes $Notes } #Deletes the new Virtual Machine (only used when Configuration fails) function DeleteVM { $disk = Get-VMHardDiskDrive -ComputerName $ComputerName -VMName $Name | Select-Object -ExpandProperty Path Remove-Item $disk Remove-VM -ComputerName $ComputerName -Name $Name -Force } #Verify that the desired Computer Name does not already exist function ValidateName { Get-VM -ComputerName $ComputerName | ForEach-Object { if ($_.VMName -eq $Name) { $script:LogOut = "$Date - Failed to create the VM with the name: $Name. A VM already exists with that name." exit } else { return } } } #Clone the $BaseImage VHD using differencing function CloneVHD { #$srcVHD = -join((Split-Path -Path $NewVHDPath), "\", $BaseImage, ".vhdx") $srcVHD = Get-VMHardDiskDrive -ComputerName $ComputerName -VMName $BaseImage | Select-Object -ExpandProperty Path $newVHD = -join((Split-Path -Path $NewVHDPath), "\", $BaseImage, "-", $Epoch, ".vhdx") New-VHD -Differencing -Path $newVHD -ParentPath $srcVHD } #Clear the Variables used function ClearVariables { #$Variables = Get-Variable | Where-Object {($_.Attributes -like "System.Management.Automation.ArgumentTypeConverterAttribute") -and ($_.Name -notin "ConfirmPreference","DebugPreference","ErrorActionPreference","InformationPreference","OutputEncoding","ProgressPreference","PSDefaultParameterValues","VerbosePreference","WarningPreference")} | Select-Object -ExpandProperty Name $Variables = ("Epoch", "BaseImage", "ComputerName", "Name", "Path", "NewVHDPath", "NewVHDSizeBytes" , "Generation", "MemoryStartupBytes", "SwitchName", "ProcessorCount", "MemoryMinimumBytes", "MemoryMaximumBytes", "AutomaticStartAction", "AutomaticStartDelay", "AutomaticStopAction", "Date", "Notes") foreach ($Variable in $Variables) { Get-Variable $Variable | Clear-Variable -Force -ErrorAction SilentlyContinue } } #Verify Log directory exists and create if not function VerifyLogDir { if( -Not (Test-Path -Path $LogDir ) ) { New-Item -ItemType directory -Path $LogDir -ErrorAction Stop } } #Set-PSDebug -Off #Set-PSDebug -Trace 2 try { ValidateName -ErrorAction Stop CloneVHD -ErrorAction stop CreateVM -ErrorAction Stop $script:LogOut = "$Date - Created VM $Name" } catch { $ErrorMessage = $_.Exception.Message $script:LogOut = "$Date - Failed to create the VM $Name. The error message was $ErrorMessage" Break } finally { echo $script:LogOut | Out-File $LogDir\vm-script.log -Append } try { ConfigureVM -ErrorAction Stop Start-VM -ComputerName $ComputerName -Name $Name -ErrorAction Stop $script:LogOut = "$Date - Configured VM $Name" } catch { $ErrorMessage = $_.Exception.Message $script:LogOut = "$Date - Failed to configure the VM $Name. The error message was $ErrorMessage ---- Deleting VM $Name due to configuration failure." DeleteVM Break } finally { echo $script:LogOut | Out-File $LogDir\vm-script.log -Append } #Get-Variable | ForEach-Object { $_.Name } ClearVariables
scvmm install vm
WIP, script to create virtual machines on a SCVMM host using templates.
param( [parameter(ParameterSetName="createvm")][int64]$Epoch = [long](Get-Date -Date ((Get-Date).ToUniversalTime()) -UFormat %s), [parameter(ParameterSetName="createvm")][ValidateSet('LAB-ENG Template','LAB-ENGINEERING TEMPLATE','LAB-CENTOS7','LAB-WIN2K16')][string]$TemplateName = "LAB-CENTOS7", [parameter(ParameterSetName="createvm")][string]$VMName = -join($TemplateName, "-", $Epoch), [parameter(ParameterSetName="createvm")][string]$Description = "GVE Test VM $BaseImage created on $( Get-Date )", [parameter(ParameterSetName="createvm")][ValidateSet('AlwaysAutoTurnOnVM','NeverAutoTurnOnVM','TurnOnVMIfRunningWhenVSStopped')][string]$StartAction = "AlwaysAutoTurnOnVM", [parameter(ParameterSetName="createvm")][ValidateSet('SaveVM','ShutdownGuestOS','TurnOffVM')][string]$StopAction = "TurnOffVM", [parameter(ParameterSetName="createvm")][string]$SCVMMServer = "scvmm1.r00tedvw.com", [parameter(ParameterSetName="createvm")][string]$sccloud = "LAB-ENG", [parameter(ParameterSetName="createvm")][string]$LogDir = "C:\logs", [parameter(ParameterSetName="createvm")][string]$UserRoleName = "ENG Users" ) #Creates a new Virtual Machine from a Template function CreateVM { $template = (Get-SCVMTemplate -VMMServer $SCVMMServer | Where-Object {$_.Name -eq $TemplateName}) $Cloud = (Get-sccloud | Where-Object {$_.Name -eq $sccloud}) $virtualmachineconfiguration = (New-SCVMConfiguration -Cloud $Cloud -VMTemplate $Template -Name $VMName) if ($VMName -like "*WIN2K16*") { $OperatingSystem = "Windows Server 2016 Standard" } elseif ($VMName -like "*WIN2K12*") { $OperatingSystem = "Windows Server 2012 Standard" } elseif ($VMName -like "*centos*") { $OperatingSystem = "CentOS Linux 7 (64 bit)" } else { $OperatingSystem = "Other (64 bit)" } New-SCVirtualMachine -Name $VMName ` -VMConfiguration $VirtualMachineConfiguration ` -Cloud $Cloud ` -Description $Description ` -StartAction $StartAction ` -StopAction $StopAction ` -OperatingSystem $OperatingSystem ` -ErrorAction Stop } #Verify that the desired Computer Name does not already exist function ValidateName { Get-SCVirtualMachine -VMMServer $SCVMMServer -ErrorAction Stop | ForEach-Object { if ($_.VMName -eq $VMName) { $script:LogOut = "$(Get-Date) - Failed to create the VM with the name: $VMName. A VM already exists with that name." exit } else { return } } } #Verify Log directory exists and create if not function VerifyLogDir { if( -Not (Test-Path -Path $LogDir ) ) { New-Item -ItemType directory -Path $LogDir -ErrorAction Stop } } #Grant Role to vm function GrantRole { Grant-SCResource -VMMServer $SCVMMServer -UserRoleName $UserRoleName -Resource $(Get-SCVirtualMachine -VMMServer $SCVMMServer -Name $VMName) -ErrorAction Stop } #Delete VM function DeleteVM { Remove-SCVirtualMachine -VM $( Get-SCVirtualMachine -VMMServer $SCVMMServer -Name $VMName ) -ErrorAction Stop } #Set-PSDebug -Off #Set-PSDebug -Trace 2 #Validate the Name and Log Directory, Create the VM try { ValidateName VerifyLogDir CreateVM $script:LogOut = "$(Get-Date) - Created VM $VMName" } catch { $ErrorMessage = $_.Exception.Message $script:LogOut = "$(Get-Date) - Failed to create the VM $VMName. The error message was $ErrorMessage" Break } finally { echo $script:LogOut | Out-File $LogDir\vm-script.log -Append } #Configure the VM and Start try { GrantRole Start-SCVirtualMachine -VM $( Get-SCVirtualMachine -VMMServer $SCVMMServer -Name $VMName ) $script:LogOut = "$(Get-Date) - Granted access for $UserRoleName to $VMName `n$(Get-Date) - Operating System for $VMName is $( if ($VMName -like "*WIN2K16*") { echo "Windows Server 2016 Standard" } elseif ($VMName -like "*WIN2K12*") { echo "Windows Server 2012 Standard" } elseif ($VMName -like "*centos*") { echo "CentOS Linux 7 (64 bit)" } else { echo "Other (64 bit)" } )" } catch { $ErrorMessage = $_.Exception.Message $script:LogOut = "$(Get-Date) - Failed to configure the VM $VMName, deleting. The error message was $ErrorMessage" Stop-SCVirtualMachine -VM $( Get-SCVirtualMachine -VMMServer $SCVMMServer -Name $VMName ) -ErrorAction SilentlyContinue DeleteVM } finally { echo $script:LogOut | Out-File $LogDir\vm-script.log -Append }