Updates
This commit is contained in:
1 parent
ada28a57e0
commit
ad3278b321
12 files changed
+4
-2
No files matched your search
@@ -0,0 +1,675 @@
|
||||
param (
|
||||
[string]$vCenter = "",
|
||||
[string]$Cluster = "",
|
||||
[string]$dvSwitch = "",
|
||||
[string]$Datastore = "",
|
||||
[string]$SourceVMName = "",
|
||||
[string]$Folder = "",
|
||||
[string]$CSVFile = "",
|
||||
[switch]$SaveCred = $false,
|
||||
[switch]$Help = $false
|
||||
)
|
||||
|
||||
Import-Module .\DRSGroupFunctions.ps1
|
||||
|
||||
function GetFolderFromPath($folder) {
|
||||
$parts = $folder.Split("\")
|
||||
if ($parts.length -eq 0) { return $folder }
|
||||
for ($x = 0; $x -lt $parts.length; ++$x) {
|
||||
$thispart = $parts[$x]
|
||||
if ($x -gt 0) {
|
||||
$thisfolder = Get-Folder $parts[$x] | Where-Object {$_.Parent.Id -eq $parent.Id}
|
||||
} else {
|
||||
$thisfolder = Get-Folder $parts[$x] | Where-Object {$_.Parent.Name -eq "vm"}
|
||||
}
|
||||
$parent = $thisfolder
|
||||
}
|
||||
return $thisfolder
|
||||
}
|
||||
|
||||
# Variables
|
||||
$fileVersion = "1.2.0"
|
||||
$fileDate = "2026-06-03"
|
||||
|
||||
# Display Script Banner
|
||||
Write-Host "--------------------------------------------------" -ForegroundColor White
|
||||
Write-Host "vSphere Testing VM Deployment Script" -ForegroundColor Green
|
||||
Write-Host "Version $($FileVersion) ($($FileDate))" -ForegroundColor Green
|
||||
Write-Host "Written by Charlie Silverman" -ForegroundColor Green
|
||||
Write-Host "--------------------------------------------------" -ForegroundColor White
|
||||
|
||||
if ($Help) {
|
||||
Write-Host
|
||||
Write-Host "Purpose: Deploy testing VMs for a set of port groups."
|
||||
Write-Host "Command Syntax:"
|
||||
Write-Host " DeployTestingVMs.ps1 (-vcenter [vCenter]) (-Cluster ""[Cluster]"") (-dvSwitch ""[dvswitch]"")" -ForegroundColor green
|
||||
Write-Host " (-SourceVMName ""[SourceVMName]"") (-CSVFile ""[csvfile]"")" -ForegroundColor green
|
||||
Write-Host "Command Line Options:"
|
||||
Write-Host
|
||||
Write-Host -NoNewLine " -vCenter " -ForegroundColor Green
|
||||
Write-Host "- The FQDN or IP address of a vCenter server."
|
||||
Write-Host -NoNewLine " -Cluster " -ForegroundColor Green
|
||||
Write-Host "- The name of the Cluster in vCenter."
|
||||
Write-Host -NoNewLine " -dvSwitch " -ForegroundColor Green
|
||||
Write-Host "- The name of the distributed virtual switch in vCenter."
|
||||
Write-Host -NoNewLine " -SourceVMName " -ForegroundColor Green
|
||||
Write-Host "- The name of the distributed virtual switch in vCenter."
|
||||
Write-Host -NoNewLine " -CSVfile " -ForegroundColor Green
|
||||
Write-Host "- The path to the CSV file. See note below for format."
|
||||
Write-Host -NoNewLine " -savecred " -ForegroundColor Green
|
||||
Write-Host "- Configure and store vCenter server credentials. This will only store the credentials under"
|
||||
Write-Host " the current logged in user."
|
||||
Write-Host -NoNewLine " -help " -ForegroundColor Green
|
||||
Write-Host "- Display command help."
|
||||
Write-Host
|
||||
Write-Host "If any of the information is not provided, you will be prompted. If a credential has been previously stored, it will"
|
||||
Write-Host "be used again unless the -savecred option is specified."
|
||||
Write-Host
|
||||
Write-Host "The CSV file must follow the format listed below. The only field required is PortGroup. Fields can be in any order."
|
||||
Write-Host " VLAN, Description, IPAddress, Netmask, Gateway, Site"
|
||||
Write-Host "Where:"
|
||||
Write-Host " VLAN " -ForegroundColor Green -NoNewLine
|
||||
Write-Host " - The VLAN tag for the port group."
|
||||
Write-Host " Description " -ForegroundColor Green -NoNewLine
|
||||
Write-Host " - The Description for the port group."
|
||||
Write-Host " IPAddress " -ForegroundColor Green -NoNewLine
|
||||
Write-Host " - IP address for the VM."
|
||||
Write-Host " Netmask " -ForegroundColor Green -NoNewLine
|
||||
Write-Host " - Netmask for the network."
|
||||
Write-Host " Gateway " -ForegroundColor Green -NoNewLine
|
||||
Write-Host " - Default gateway for the network."
|
||||
Write-Host " Site " -ForegroundColor Green -NoNewLine
|
||||
Write-Host " - The site prefix to be used for DRS group configuration."
|
||||
Write-Host ""
|
||||
Write-Host "The port group name will be assumed to be in the following format: ""[Description] - VLAN[VLAN]"""
|
||||
Write-Host "If the VLAN tag is 12 and the description is ""Big Servers"", the port group name will be ""Big Servers - VLAN12"""
|
||||
Write-Host ""
|
||||
Write-Host "The DRS group name will be assumed to be in the following format: ""[Site] Only VMs"""
|
||||
Write-Host "If the Site is Primary, the DRS group name will be ""Primary Only VMs"""
|
||||
Write-Host ""
|
||||
Write-Host "Additionally, the new VM names will be in the format ""KISStress - VLAN[VLAN]"""
|
||||
exit
|
||||
}
|
||||
|
||||
try {
|
||||
$data = import-csv $CSVFile
|
||||
} catch {
|
||||
Write-Host "ERROR: Input file is not in a valid format." -ForegroundColor Yellow -BackgroundColor Red
|
||||
Write-Host "Message: $($_.Exception.Message)" -ForegroundColor yellow
|
||||
exit
|
||||
}
|
||||
|
||||
if (!($data | Where-Object {$_.PSObject.Properties.Name -contains "VLAN"}) -or (!($data | Where-Object {$_.PSObject.Properties.Name -contains "Description"}))) {
|
||||
Write-Host "ERROR: Input file is not in a valid format." -ForegroundColor Yellow -BackgroundColor Red
|
||||
exit
|
||||
}
|
||||
|
||||
$setip = $false
|
||||
|
||||
if ($data | Where-Object {$_.PSObject.Properties.Name -contains "IPAddress"}) {
|
||||
if ($data | Where-Object {$_.PSObject.Properties.Name -contains "Netmask"}) {
|
||||
if ($data | Where-Object {$_.PSObject.Properties.Name -contains "Gateway"}) {
|
||||
$setip = $true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($vCenter -eq "") {
|
||||
$vCenter = Read-Host "Enter name of vCenter Server"
|
||||
}
|
||||
|
||||
if ($SaveCred) {
|
||||
$credential = Get-Credential -Message "Enter credentials for vCenter server $vCenter"
|
||||
$credential | Export-Clixml -path $env:USERPROFILE\kistools-$vcenter.cred
|
||||
Write-Host "Saving credentials."
|
||||
}
|
||||
|
||||
if (Test-Path -path $env:USERPROFILE\kistools-$vcenter.cred -PathType Leaf) {
|
||||
$credentials = Import-Clixml -path $env:USERPROFILE\kistools-$vcenter.cred
|
||||
Write-Host "Using stored credentials"
|
||||
} else {
|
||||
$credentials = Get-Credential -Message "Enter credentials for vCenter server $vCenter"
|
||||
if (!$credentials) {
|
||||
Write-Host "ERROR: No credentials were entered" -ForegroundColor Yellow -BackgroundColor Red -NoNewLine
|
||||
Write-Host ""
|
||||
Write-Host "Operation Terminated" -ForegroundColor Yellow
|
||||
exit
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Write-Host -NoNewLine "Connecting to vCenter $vcenter... "
|
||||
$vcconn = Connect-VIServer $vcenter -Credential $credentials -ErrorAction Stop
|
||||
Write-Host "Success" -ForegroundColor green
|
||||
} catch {
|
||||
Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red -NoNewLine
|
||||
Write-Host ""
|
||||
Write-Host "Message: $($_.Exception.Message)" -ForegroundColor yellow
|
||||
Write-Host "Operation Terminated" -ForegroundColor Yellow
|
||||
exit
|
||||
}
|
||||
|
||||
if ($Cluster -eq "") {
|
||||
$Clusterlist = Get-Cluster | Sort-Object
|
||||
$startpos = 0
|
||||
$step = 10
|
||||
While (($Cluster -eq "") -or (-not $Cluster)) {
|
||||
$endpos = $startpos + 10;
|
||||
if ($endpos -gt $Clusterlist.length) { $endpos = $Clusterlist.length }
|
||||
$page = $startpos / $step + 1
|
||||
$maxpage = [math]::Ceiling($Clusterlist.length / $step)
|
||||
Write-Host "`nCluster Selection (Page $page of $maxpage):`n"
|
||||
if ($startpos -gt 0) {
|
||||
Write-Host " 0" -NoNewLine -ForegroundColor Green
|
||||
Write-Host ": " -NoNewLine -ForegroundColor Gray
|
||||
Write-Host "<< Previous Page" -ForegroundColor White
|
||||
}
|
||||
for ($x = $startpos; $x -lt $endpos; $x++) {
|
||||
Write-Host "$(([string]($x+1-$startpos)).PadLeft(3,' '))" -NoNewLine -ForegroundColor Green
|
||||
Write-Host ": " -NoNewLine -ForegroundColor Gray
|
||||
Write-Host "$($Clusterlist[$x].name)" -ForegroundColor Yellow
|
||||
}
|
||||
if ($endpos -lt $Clusterlist.length) {
|
||||
Write-Host " $($step+1)" -NoNewLine -ForegroundColor Green
|
||||
Write-Host ": " -NoNewLine -ForegroundColor Gray
|
||||
Write-Host ">> Next Page" -ForegroundColor White
|
||||
}
|
||||
$Clusternum = Read-Host "`nSelect Cluster Number"
|
||||
$Clusternum = [int]$Clusternum - 1
|
||||
if ($Clusternum -eq -1) {
|
||||
$startpos -= $step
|
||||
continue
|
||||
}
|
||||
if ($Clusternum -eq $step) {
|
||||
$startpos += $step
|
||||
continue
|
||||
}
|
||||
$Cluster = $Clusterlist[$Clusternum + $startpos].Name
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Write-Host "Validating cluster ""$Cluster""... " -NoNewLine
|
||||
$mycluster = get-cluster $Cluster
|
||||
Write-Host "Success" -ForegroundColor Green
|
||||
} catch {
|
||||
Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red
|
||||
Write-Host "ERROR: Unable to locate cluster ""$Cluster"" in $vCenter" -ForegroundColor Yellow -BackgroundColor Red -NoNewLine
|
||||
Write-Host ""
|
||||
Write-Host "Operation Terminated" -ForegroundColor Yellow
|
||||
exit
|
||||
}
|
||||
|
||||
if ($dvSwitch -eq "") {
|
||||
$myhost = $mycluster | Get-VMHost | Select-Object -First 1
|
||||
$SwitchList = Get-VdSwitch -VMHost $myhost
|
||||
$startpos = 0
|
||||
$step = 10
|
||||
While (($dvSwitch -eq "") -or (-not $dvSwitch)) {
|
||||
$endpos = $startpos + 10;
|
||||
if ($endpos -gt $SwitchList.length) { $endpos = $SwitchList.length }
|
||||
$page = $startpos / $step + 1
|
||||
$maxpage = [math]::Ceiling($SwitchList.length / $step)
|
||||
Write-Host "`ndvSwitch Selection (Page $page of $maxpage):`n"
|
||||
if ($startpos -gt 0) {
|
||||
Write-Host " 0" -NoNewLine -ForegroundColor Green
|
||||
Write-Host ": " -NoNewLine -ForegroundColor Gray
|
||||
Write-Host "<< Previous Page" -ForegroundColor White
|
||||
}
|
||||
for ($x = $startpos; $x -lt $endpos; $x++) {
|
||||
Write-Host "$(([string]($x+1-$startpos)).PadLeft(3,' '))" -NoNewLine -ForegroundColor Green
|
||||
Write-Host ": " -NoNewLine -ForegroundColor Gray
|
||||
Write-Host "$($SwitchList[$x].name)" -ForegroundColor Yellow
|
||||
}
|
||||
if ($endpos -lt $SwitchList.length) {
|
||||
Write-Host " $($step+1)" -NoNewLine -ForegroundColor Green
|
||||
Write-Host ": " -NoNewLine -ForegroundColor Gray
|
||||
Write-Host ">> Next Page" -ForegroundColor White
|
||||
}
|
||||
$dvSwitchnum = Read-Host "`nSelect dvSwitch Number"
|
||||
$dvSwitchnum = [int]$dvSwitchnum - 1
|
||||
if ($dvSwitchnum -eq -1) {
|
||||
$startpos -= $step
|
||||
continue
|
||||
}
|
||||
if ($dvSwitchnum -eq $step) {
|
||||
$startpos += $step
|
||||
continue
|
||||
}
|
||||
$dvSwitch = $SwitchList[$dvSwitchnum + $startpos].Name
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Write-Host "Validating dvSwitch ""$dvSwitch""... " -NoNewLine
|
||||
$mydvSwitch = Get-VdSwitch $dvSwitch
|
||||
Write-Host "Success" -ForegroundColor Green
|
||||
} catch {
|
||||
Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red
|
||||
Write-Host "ERROR: Unable to locate dvSwitch $dvSwitch in $vCenter" -ForegroundColor Yellow -BackgroundColor Red -NoNewLine
|
||||
Write-Host ""
|
||||
exit
|
||||
}
|
||||
|
||||
if ($SourceVMName -eq "") {
|
||||
$VMList = $mycluster | Get-VM
|
||||
$startpos = 0
|
||||
$step = 10
|
||||
While (($SourceVMName -eq "") -or (-not $SourceVMName)) {
|
||||
$endpos = $startpos + 10;
|
||||
if ($endpos -gt $VMList.length) { $endpos = $VMList.length }
|
||||
$page = $startpos / $step + 1
|
||||
$maxpage = [math]::Ceiling($VMList.length / $step)
|
||||
Write-Host "`nSource VM Selection (Page $page of $maxpage):`n"
|
||||
if ($startpos -gt 0) {
|
||||
Write-Host " 0" -NoNewLine -ForegroundColor Green
|
||||
Write-Host ": " -NoNewLine -ForegroundColor Gray
|
||||
Write-Host "<< Previous Page" -ForegroundColor White
|
||||
}
|
||||
for ($x = $startpos; $x -lt $endpos; $x++) {
|
||||
Write-Host "$(([string]($x+1-$startpos)).PadLeft(3,' '))" -NoNewLine -ForegroundColor Green
|
||||
Write-Host ": " -NoNewLine -ForegroundColor Gray
|
||||
Write-Host "$($VMlist[$x].name)" -ForegroundColor Yellow
|
||||
}
|
||||
if ($endpos -lt $VMList.length) {
|
||||
Write-Host " $($step+1)" -NoNewLine -ForegroundColor Green
|
||||
Write-Host ": " -NoNewLine -ForegroundColor Gray
|
||||
Write-Host ">> Next Page" -ForegroundColor White
|
||||
}
|
||||
$VMnum = Read-Host "`nSelect VM Number"
|
||||
$VMnum = [int]$VMnum - 1
|
||||
if ($VMnum -eq -1) {
|
||||
$startpos -= $step
|
||||
continue
|
||||
}
|
||||
if ($VMnum -eq $step) {
|
||||
$startpos += $step
|
||||
continue
|
||||
}
|
||||
$SourceVMName = $VMlist[$VMnum + $startpos].Name
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Write-Host "Locating source VM ""$SourceVMName""... " -NoNewLine
|
||||
if ($abyss = Get-VM $SourceVMName -ErrorAction Stop) {
|
||||
Write-Host "Success" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red -NoNewLine
|
||||
Write-Host ""
|
||||
Write-Host "Operation Aborted" -ForegroundColor Yellow
|
||||
}
|
||||
} catch {
|
||||
Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red
|
||||
Write-Host "ERROR: Error locating VM $SourceVMName in $vCenter" -ForegroundColor Yellow -BackgroundColor Red -NoNewLine
|
||||
Write-Host ""
|
||||
Write-Host "Operation Terminated" -ForegroundColor Yellow
|
||||
exit
|
||||
}
|
||||
|
||||
if ($Datastore -eq "") {
|
||||
$DSList = $mycluster | Get-Datastore | Where-Object {$_.ExtensionData.Host.Count -gt 1}
|
||||
$startpos = 0
|
||||
$step = 10
|
||||
While (($Datastore -eq "") -or (-not $Datastore)) {
|
||||
$endpos = $startpos + 10;
|
||||
if ($endpos -gt $DSList.length) { $endpos = $DSList.length }
|
||||
$page = $startpos / $step + 1
|
||||
$maxpage = [math]::Ceiling($DSList.length / $step)
|
||||
Write-Host "`nDatastore Selection (Page $page of $maxpage):`n"
|
||||
if ($startpos -gt 0) {
|
||||
Write-Host " 0" -NoNewLine -ForegroundColor Green
|
||||
Write-Host ": " -NoNewLine -ForegroundColor Gray
|
||||
Write-Host "<< Previous Page" -ForegroundColor White
|
||||
}
|
||||
for ($x = $startpos; $x -lt $endpos; $x++) {
|
||||
Write-Host "$(([string]($x+1-$startpos)).PadLeft(3,' '))" -NoNewLine -ForegroundColor Green
|
||||
Write-Host ": " -NoNewLine -ForegroundColor Gray
|
||||
Write-Host "$($DSlist[$x].name)" -ForegroundColor Yellow
|
||||
}
|
||||
if ($endpos -lt $DSList.length) {
|
||||
Write-Host " $($step+1)" -NoNewLine -ForegroundColor Green
|
||||
Write-Host ": " -NoNewLine -ForegroundColor Gray
|
||||
Write-Host ">> Next Page" -ForegroundColor White
|
||||
}
|
||||
$dvSwitchnum = Read-Host "`nSelect Datastore Number"
|
||||
$dvSwitchnum = [int]$dvSwitchnum - 1
|
||||
if ($dvSwitchnum -eq -1) {
|
||||
$startpos -= $step
|
||||
continue
|
||||
}
|
||||
if ($dvSwitchnum -eq $step) {
|
||||
$startpos += $step
|
||||
continue
|
||||
}
|
||||
$Datastore = $DSlist[$dvSwitchnum + $startpos].Name
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Write-Host "Locating Datastore ""$Datastore""... " -NoNewLine
|
||||
$mydatastore = Get-Datastore $Datastore -ErrorAction Stop
|
||||
if ($mydatastore) {
|
||||
Write-Host "Success" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red
|
||||
Write-Host "ERROR: Unable to locate datastore $Datastore in $Cluster" -ForegroundColor Yellow -BackgroundColor Red -NoNewLine
|
||||
Write-Host ""
|
||||
Write-Host "Operation Terminated" -ForegroundColor Yellow
|
||||
}
|
||||
} catch {
|
||||
Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red
|
||||
Write-Host "ERROR: Error locating Datastore $Datastore in $vCenter" -ForegroundColor Yellow -BackgroundColor Red -NoNewLine
|
||||
Write-Host ""
|
||||
Write-Host "Operation Terminated" -ForegroundColor Yellow
|
||||
exit
|
||||
}
|
||||
|
||||
if ($Folder -eq "") {
|
||||
Write-Host "Inventorying VM Folder Structure..." -NoNewLine
|
||||
$FolderList = Get-Folder | Where-Object {$_.Parent.Name -eq "vm"} | Sort-Object -Property @{Expression={$_.Name}; Descending=$false}
|
||||
$FolderList += Get-Folder | Where-Object {($_.Parent.Name -ne "vm") -and ($_.Type -eq "VM") -and $($_.Name -ne "vm")} | Sort-Object -Property @{Expression={$_.Parent.Name}; Descending=$false},@{Expression={$_.Name}; Descending=$false}
|
||||
Write-Host " Success" -ForegroundColor Green
|
||||
for($x = 0; $x -lt $FolderList.length; ++$x) {
|
||||
$thisfolder = $FolderList[$x]
|
||||
$path = ""
|
||||
if ($thisfolder.Parent.Name -ne "vm") {
|
||||
$searchcount = 0
|
||||
While ($searchcount -lt 10) {
|
||||
$nextfolder = $thisfolder.Parent
|
||||
$path = "$($nextfolder.Name)\$($path)"
|
||||
if ($nextfolder.Parent.Name -ne "vm") {
|
||||
$thisfolder = $nextfolder
|
||||
++$searchcount
|
||||
} else {
|
||||
$searchcount = 11
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($path -ne "") {
|
||||
$path = "$($path)$($Folderlist[$x].Name)"
|
||||
} else {
|
||||
$path = $Folderlist[$x].Name
|
||||
}
|
||||
|
||||
$FolderList[$x] | Add-Member -NotePropertyName "FullPath" -NotePropertyValue $path
|
||||
}
|
||||
$startpos = 0
|
||||
$step = 10
|
||||
|
||||
While (-not $myfolder) {
|
||||
$endpos = $startpos + 10;
|
||||
if ($endpos -gt $FolderList.length) { $endpos = $FolderList.length }
|
||||
$page = $startpos / $step + 1
|
||||
$maxpage = [math]::Ceiling($FolderList.length / $step)
|
||||
Write-Host "`nFolder Selection (Page $page of $maxpage):`n"
|
||||
if ($startpos -gt 0) {
|
||||
Write-Host " 0" -NoNewLine -ForegroundColor Green
|
||||
Write-Host ": " -NoNewLine -ForegroundColor Gray
|
||||
Write-Host "<< Previous Page" -ForegroundColor White
|
||||
}
|
||||
for ($x = $startpos; $x -lt $endpos; $x++) {
|
||||
$path = $Folderlist[$x].FullPath
|
||||
Write-Host "$(([string]($x+1-$startpos)).PadLeft(3,' '))" -NoNewLine -ForegroundColor Green
|
||||
Write-Host ": " -NoNewLine -ForegroundColor Gray
|
||||
Write-Host "$path" -ForegroundColor Yellow
|
||||
}
|
||||
if ($endpos -lt $FolderList.length) {
|
||||
Write-Host " $($step+1)" -NoNewLine -ForegroundColor Green
|
||||
Write-Host ": " -NoNewLine -ForegroundColor Gray
|
||||
Write-Host ">> Next Page" -ForegroundColor White
|
||||
}
|
||||
$Foldernum = Read-Host "`nSelect Folder Number"
|
||||
$Foldernum = [int]$Foldernum - 1
|
||||
if ($Foldernum -eq -1) {
|
||||
$startpos -= $step
|
||||
continue
|
||||
}
|
||||
if ($Foldernum -eq $step) {
|
||||
$startpos += $step
|
||||
continue
|
||||
}
|
||||
|
||||
$Folder = $FolderList[$Foldernum].FullPath
|
||||
$myfolder = $FolderList[$Foldernum].Name
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Write-Host "Locating Folder ""$Folder""... " -NoNewLine
|
||||
$myfolder = GetFolderFromPath($Folder)
|
||||
if ($myfolder) {
|
||||
Write-Host "Success" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red -NoNewLine
|
||||
Write-Host ""
|
||||
Write-Host "Operation Terminated" -ForegroundColor Yellow
|
||||
}
|
||||
} catch {
|
||||
Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red
|
||||
Write-Host "ERROR: Error locating Folder $Folder in $vCenter" -ForegroundColor Yellow -BackgroundColor Red -NoNewLine
|
||||
Write-Host ""
|
||||
Write-Host "Operation Terminated" -ForegroundColor Yellow
|
||||
exit
|
||||
}
|
||||
|
||||
## Validate that the proper DRS groups exist for each site in the format "[site] Only VMs"
|
||||
Write-Host "Verifying that the necessary DRS groups exist..."
|
||||
$sites = $data.Site | Select-Object -Unique -CaseInsensitive
|
||||
|
||||
$siteerror = $false
|
||||
foreach ($site in $sites) {
|
||||
$sitegroup = "$site Only VMs"
|
||||
Write-Host " - $sitegroup... " -NoNewLine
|
||||
try {
|
||||
$drsg = Get-DrsGroup -Cluster $Cluster -Name $sitegroup
|
||||
if ($drsg) {
|
||||
Write-Host "Success" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red -NoNewLine
|
||||
Write-Host ""
|
||||
$siteerror = $true
|
||||
}
|
||||
} catch {
|
||||
Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red -NoNewLine
|
||||
Write-Host "ERROR: Unable to locate DRS group $sitegroup." -ForegroundColor Yellow -BackgroundColor Red -NoNewLine
|
||||
Write-Host ""
|
||||
$siteerror = $true
|
||||
}
|
||||
}
|
||||
|
||||
if ($siteerror) {
|
||||
Write-Host "Operation Terminated" -ForegroundColor Yellow
|
||||
exit
|
||||
}
|
||||
|
||||
## Validate that the necessary network port groups exist in the format "[Description] - VLAN[VLAN]"
|
||||
Write-Host "Verifying that the necessary port groups exist..."
|
||||
$pgerror = $false
|
||||
foreach ($row in $data) {
|
||||
$vlan = [int]$row.VLAN
|
||||
$description = $row.Description
|
||||
$myportgroupname = "$description - VLAN$vlan"
|
||||
Write-Host " - $myportgroupname... " -NoNewLine
|
||||
try {
|
||||
$pg = Get-VDPortGroup -Name $myportgroupname
|
||||
if ($pg) {
|
||||
Write-Host "Success" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red
|
||||
$pgerror = $true
|
||||
}
|
||||
} catch {
|
||||
Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red
|
||||
$pgerror = $true
|
||||
}
|
||||
}
|
||||
|
||||
if ($pgerror) {
|
||||
Write-Host "Operation Terminated" -ForegroundColor Yellow
|
||||
exit
|
||||
}
|
||||
|
||||
exit
|
||||
|
||||
foreach($row in $data) {
|
||||
try {
|
||||
$abyss = [int]$row.VLAN
|
||||
} catch {
|
||||
continue
|
||||
}
|
||||
$vlan = [int]$row.VLAN
|
||||
$description = $row.Description
|
||||
|
||||
$myportgroupname = "$description - VLAN$vlan"
|
||||
$myvmname = "KISStress - VLAN$vlan"
|
||||
|
||||
Write-Host
|
||||
|
||||
try {
|
||||
if (Get-VM $myvmname -ErrorAction Silent) {
|
||||
Write-Host "WARNING: VM ""$myvmname"" already exists. Skipping." -ForegroundColor Yellow
|
||||
continue
|
||||
}
|
||||
} catch {
|
||||
Write-Host "ERROR: Unable to determine if ""$myvmname"" exists. Skipping." -ForegroundColor Red
|
||||
continue
|
||||
}
|
||||
|
||||
try {
|
||||
$myportgroup = Get-VdPortGroup -Name $myportgroupname -VDSwitch $dvswitch
|
||||
} catch {
|
||||
Write-Host "ERROR: Could not locate port group ""$myportgroupname"""
|
||||
continue
|
||||
}
|
||||
|
||||
Write-Host "Cloning ""$SourceVMName"" to VM ""$myvmname""... " -NoNewLine
|
||||
try {
|
||||
$task = New-VM -Name $myvmname -VM $SourceVMName -ResourcePool $mycluster -Datastore $Datastore -Location $myfolder -DiskStorageFormat Thin -ErrorAction Silent -RunAsync
|
||||
} catch {
|
||||
Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red
|
||||
Write-Host "Message: $($_.Exception.Message)" -ForegroundColor yellow
|
||||
continue
|
||||
}
|
||||
|
||||
$created = $false
|
||||
while (($task = Get-Task -iD $task.Id).State -eq "Running") {
|
||||
Start-Sleep -Seconds 5
|
||||
Write-Host "." -NoNewLine
|
||||
}
|
||||
switch(($task = Get-Task -iD $task.Id).State) {
|
||||
"Success" {
|
||||
Write-Host "Success" -ForegroundColor Green
|
||||
}
|
||||
"Error" {
|
||||
if ($task.ExtensionData.Info.Cancelled) {
|
||||
Write-Host "Failure - Task Cancelled" -ForegroundColor Yellow -BackgroundColor Red
|
||||
continue
|
||||
} else {
|
||||
Write-Host "Failure - Unknown Error" -ForegroundColor Yellow -BackgroundColor Red
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
$nic = Get-VM $myvmname | Get-NetworkAdapter
|
||||
try {
|
||||
Write-Host "Changing NIC on VM ""$myvmname"" to port group ""$myportgroupname""... " -NoNewLine
|
||||
$task = $nic | Set-NetworkAdapter -Portgroup $myportgroup -Confirm:$false -ErrorAction Stop -RunAsync
|
||||
while (($task = Get-Task -iD $task.Id).State -eq "Running") {
|
||||
Start-Sleep -Seconds 1
|
||||
Write-Host "." -NoNewLine
|
||||
}
|
||||
switch(($task = Get-Task -iD $task.Id).State) {
|
||||
"Success" {
|
||||
Write-Host "Success" -ForegroundColor Green
|
||||
}
|
||||
"Error" {
|
||||
if ($task.ExtensionData.Info.Cancelled) {
|
||||
Write-Host "Failure - Task Cancelled" -ForegroundColor Yellow -BackgroundColor Red
|
||||
} else {
|
||||
Write-Host "Failure - Unknown Error" -ForegroundColor Yellow -BackgroundColor Red
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
Write-Host " Failure" -ForegroundColor Yellow -BackgroundColor Red
|
||||
Write-Host "Message: $($_.Exception.Message)" -ForegroundColor yellow
|
||||
}
|
||||
|
||||
if ($row.Site) {
|
||||
Write-Host "Adding VM ""$myvmname"" to DRS Group ""$($row.Site) Only VMs"" in cluster $Cluster... " -NoNewLine
|
||||
try {
|
||||
$task = Add-VMToDrsGroup -Cluster $Cluster -DrsGroup "$($row.Site) Only VMs" -VM $myvmname
|
||||
$task | Add-Member -NotePropertyName "Id" -NotePropertyValue "Task-$($task.Value)"
|
||||
} catch {
|
||||
Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red
|
||||
Write-Host "ERROR: Error adding VM ""$myvmname"" to DRS Group ""$($row.Site) Only VMs""" -ForegroundColor Yellow -BackgroundColor Red
|
||||
Write-Host "Message: $($_.Exception.Message)" -ForegroundColor yellow
|
||||
continue
|
||||
}
|
||||
|
||||
while (($task = Get-Task -iD $task.Id).State -eq "Running") {
|
||||
Start-Sleep -Seconds 1
|
||||
Write-Host "." -NoNewLine
|
||||
}
|
||||
switch(($task = Get-Task -iD $task.Id).State) {
|
||||
"Success" {
|
||||
Write-Host "Success" -ForegroundColor Green
|
||||
}
|
||||
"Error" {
|
||||
if ($task.ExtensionData.Info.Cancelled) {
|
||||
Write-Host "Failure - Task Cancelled" -ForegroundColor Yellow -BackgroundColor Red
|
||||
} else {
|
||||
Write-Host "Failure - Unknown Error" -ForegroundColor Yellow -BackgroundColor Red
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Write-Host "Powering on VM ""$myvmname""... " -NoNewLine
|
||||
$task = Start-VM $myvmname -ErrorAction Stop -RunAsync
|
||||
} catch {
|
||||
Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red
|
||||
Write-Host "Message: $($_.Exception.Message)" -ForegroundColor yellow
|
||||
}
|
||||
|
||||
$booted = $false
|
||||
while (!$booted) {
|
||||
if ((Get-VM $myvmname).ExtensionData.Guest.ToolsStatus -eq "toolsOk") {
|
||||
$booted = $true
|
||||
continue
|
||||
}
|
||||
Start-Sleep 5
|
||||
Write-Host "." -NoNewLine
|
||||
}
|
||||
Write-Host "Success" -ForegroundColor Green
|
||||
|
||||
# Update Network Information If Provided
|
||||
if ($setip) {
|
||||
$ipaddress = $row.IPAddress
|
||||
$netmask = $row.netmask
|
||||
$gateway = $row.Gateway
|
||||
|
||||
if (!$ipaddress -or !$netmask -or !$gateway) { continue }
|
||||
Write-Host "Updating network configuration for vm ""$myvmname""... " -NoNewLine
|
||||
|
||||
$ifcfg = "sudo echo 'STARTMODE=auto' > /etc/sysconfig/network/ifcfg-eth0
|
||||
sudo echo 'BOOTPROTO=static' >> /etc/sysconfig/network/ifcfg-eth0
|
||||
sudo echo 'IPADDR=$ipaddress' >> /etc/sysconfig/network/ifcfg-eth0
|
||||
sudo echo 'NETMASK=$netmask' >> /etc/sysconfig/network/ifcfg-eth0
|
||||
sudo echo 'default $gateway - -' > /etc/sysconfig/network/routes
|
||||
sudo /etc/init.d/network restart
|
||||
"
|
||||
$UserName = "stress"
|
||||
$Password = ConvertTo-SecureString -String "stress" -AsPlainText -Force
|
||||
$Credential = New-Object System.Management.Automation.PSCredential -ArgumentList $UserName, $Password
|
||||
try {
|
||||
$abyss = Invoke-VMScript $myvmname -ScriptText $ifcfg -GuestCredential $Credential -ScriptType Bash
|
||||
Write-Host "Success" -ForegroundColor Green
|
||||
} catch {
|
||||
Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red
|
||||
Write-Host "Message: $($_.Exception.Message)" -ForegroundColor yellow
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user