#---------------------------------------------------------------------------------------------------------------------------------------------------- #vCenter Credentials $creds = Get-Credential Connect-VIServer itdvmvc1.nd.gov, itdvmvc2.nd.gov -Credential $creds #---------------------------------------------------------------------------------------------------------------------------------------------------- #ConvertTo-Array $VMs=@" itdtaxtga1.nd.gov itdtaxpfa1.nd.gov itdtaxsga1.nd.gov itdtaxsga2.nd.gov itdtaxpga1.nd.gov itdtaxpga2.nd.gov itdtaxpga3.nd.gov "@ $VMs=ConvertTo-Array -MultiLineString $VMs #---------------------------------------------------------------------------------------------------------------------------------------------------- #Move VM to Datastore $VMdatastore = 'VMWINDOWS1_143_A9K_R_SHRDPPLSFTST' Get-VM $VMs | Get-HardDisk Get-VM $VMs | Move-VM -DiskStorageFormat Thin -Datastore $VMdatastore #---------------------------------------------------------------------------------------------------------------------------------------------------- #Copy Files to/from Remote Computer #$fileloc = "C:\Users\delange\State of North Dakota\-Tm-ITD-Virtualization - Documents\VMware\Upgrades\ESXi\6.5.0Update3preGen9\VMware-ESXi-6.5.0-Update3-13932383-HPE-preGen9-650.U3.9.6.8.8-Jun2019.iso" $fileloc = "C:\users\delange\Downloads\sql.zip" #$fileloc = "O:\Backups\vp_grandforks\vp_grandforks.bak" #$fileloc = "C:\temp3\AccelaSchool\*" #$fileloc = "C:\temp\vp_bis_11252019.bak" #$fileloc = "C:\ITD\vc-itdvmvc1.nd.gov-2020-01-14--19.33-53492.tgz" #$fileloc = "D:\Upgrades\VMware\VMware-VCSA-all-6.5.0-14836121.iso" #$fileloc = "F:\Support Bundles\vc-itdvmvc1.nd.gov-2020-01-07--19.02-29010.tgz" #$destination = "D:\Upgrades\VMware\" #$destination = "D:\delange" #$destination = "C:\users\delange\Downloads\" #$destination = "C:\inetpub\wwwroot\" $destination = "D:\ITD\temp\" #$servers = 'itdvmutil' $servers = 'itdps-update.nd.gov' #$servers = 'itdps-images.nd.gov' #Copy to server foreach ($server in $servers){ $s=New-PSSession $server -Credential $creds Copy-Item $fileloc -ToSession $s -Destination $destination } #Copy from server foreach ($server in $servers){ $s=New-PSSession $server -Credential $creds Copy-Item $fileloc -FromSession $s -Destination $destination } #---------------------------------------------------------------------------------------------------------------------------------------------------- #Approve New VMs Compare-ITDVMwareVMtoSharePoint -NewBuilds -OutVariable MatchSP | Format-Table $MatchSP -Match $false | Sort-Object Name | Format-Table $VMs=@" itdohrcdbp1.nd.gov itdohrcwebp1.nd.gov "@ $VMs=ConvertTo-Array -MultiLineString $VMs Approve-ITDVMwareVMNewBuild -ComputerName $VMs #---------------------------------------------------------------------------------------------------------------------------------------------------- #Snapshots/Clones #Get Current Snapshots Get-VM | Get-Snapshot | Select-Object Name,VM | Sort-Object -Property Name | Format-Table -AutoSize #| clip.exe #Take Snapshot $SnapId = 2151..2156 New-ITDVMwareVMSnapshotTask -id $SnapId -vCenterCredential $creds #Delete Snapshot from Scripted Task $SnapId = 2186 Remove-ITDVMwareVMSnapshot -Id $SnapId -vCenterCredential $creds #Delete Snapshot taken manually $VM = 'bnd0704.nd.gov','itdscmt1.nd.gov' Get-VM -Name $VM | Where-Object -Property PowerState -EQ PoweredOn | Get-Snapshot | Remove-Snapshot -Confirm:$false #New Clone $CloneId = 2149 New-ITDVMwareVMCloneTask -Id $CloneId -vCenterCredential $creds #Delete Clone $CloneId = 2117 Get-VM | Where-Object -Property Name -Like "*$CloneId*" foreach ($Clone in $CloneId){ $DeleteClone = Get-VM | Where-Object -Property Name -Like "*$Clone*" $DeleteClone | Remove-VM -DeleteFromDisk -Confirm:$false } #Snap entire vCenter environment at once Get-VM itdvmpsc1*,itdvmvc1*,itdvmpsc2*,itdvmvc2* | New-Snapshot -Name "Converge External PSC" Get-VM itdvmpsct1*,itdvmvct1*,itdvmpsct2*,itdvmvct2* | New-Snapshot -Name "PSCT2 Decommissioned" #---------------------------------------------------------------------------------------------------------------------------------------------------- #Edit VMs #Add CPU $VMs = 'itdsql16p1.nd.gov' $cpu = '4' Get-VM $VMs Set-VM $VMs -NumCpu $cpu -Confirm:$false #Remove CPU $VMs = 'bnd0557.nd.gov' $cpu = '1' Get-VM -Name $VMs | Shutdown-VMGuest -Confirm:$false #Start-Sleep -Seconds 60 Get-VM -Name $VMs Get-VM -Name $VMs | Set-VM -NumCPU $cpu -Confirm:$false Start-VM $VMs -Confirm:$false #Increase RAM $VMs = 'itdcndhf16qps.nd.gov','itdcndhefqps.nd.gov' $ram = '12' Get-VM $VMs Set-VM $VMs -MemoryGB $ram -Confirm:$false #Remove RAM $VMs = '' $ram = '' Get-VM $VMs | Shutdown-VMGuest -Confirm:$false Start-Sleep -Seconds 60 Get-VM -Name $VMs | Set-VM -MemoryGB 16 -Confirm:$false Start-VM $VMs -Confirm:$false #Disconnect CDROM $VMs = 'itdcndstrwt7.nd.gov' foreach ($VM in $VMs){ Get-VM $VM | Get-CDDrive | Set-CDDrive -NoMedia -Confirm:$false } #Expand Disks $VM = 'itdcndstvm04.nd.gov' Get-VM | Where-Object -Property Name -Like "*$VM*" Get-VM $VM | Get-HardDisk | Select-Object Name,CapacityGB,Filename $harddisk = "Hard Disk 2" $increasedisk = 3 $datastore = Get-VM $VM | Get-HardDisk | Where-Object -Property Name -EQ $harddisk | Get-Datastore Get-Datastore $datastore | Select Name,FreeSpaceGB,CapacityGB $newcap = (Get-VM $VM | Get-HardDisk | Where-Object -Property Name -EQ $harddisk).CapacityGB + $increasedisk $newcap Get-VM $VM | Get-HardDisk | Where-Object -Property Name -EQ $harddisk | Set-HardDisk -CapacityGB $newcap -Confirm:$false #List NumCpu, MemoryGB, Total HardDiskSizeGB $VMs = 'itd1xaes2','itdbiscmsvr','itdredskyaes','itdwfoaes4' $datacenter = 'Primary Datacenter' $harddisk = @{n="HardDiskSizeGB";e={(Get-HardDisk -VM $_ | Measure-Object -Sum CapacityGB).Sum}} foreach ($VM in $VMs){ Get-Datacenter $datacenter | Get-VM | Where-Object -Property Name -Like "$VM*" | Select-Object -Property Name,NumCpu,MemoryGB,$harddisk } foreach ($VM in $VMs){ Get-VM | Where-Object -Property Name -Like "$VM*" | Get-HardDisk | Select-Object Name,CapacityGB,Filename | Sort-Object Filename -Descending } #---------------------------------------------------------------------------------------------------------------------------------------------------- #Port groups #New distributed port group $IP = '10.2.160.240/28' <#10.10.10.10/28#> $VLANid = '3326' <#0001#> New-ITDVMNetwork -CIDR $IP -VLAN $VLANid #Remove distributed port group $portgroup = 'dvPG_' Get-VDPortgroup | Where-Object -Property Name -EQ $portgroup | Remove-VDPortGroup -Confirm:$false #Manually add port group $BismarckVDSwitch = 'dvSwitch3-PDC-AVAYA1-Data' $MandanVDSwitch = 'dvSwitch3-SDC-AVAYA2-Data' $PGName = 'dvPG3_2278_165.234.164.0_27' $VlanId = '2278' Get-VDSwitch -Name $BismarckVDSwitch | New-VDPortGroup -Name $PGName -NumPorts 1 -VlanId $VlanId Get-VDSwitch -Name $BismarckVDSwitch | Get-VDPortGroup | Where-Object {$_.Name -like ("*" + "_" + $VlanId)} | Get-VDUplinkTeamingPolicy | Set-VDUplinkTeamingPolicy -FailoverDetectionPolicy BeaconProbing Get-VDSwitch -Name $BismarckVDSwitch | Get-VDPortGroup | Where-Object {$_.Name -like ("*" + "_" + $VlanId)} | Get-VDPortgroupOverridePolicy | Set-VDPortgroupOverridePolicy -BlockOverrideAllowed $false -ResetPortConfigAtDisconnect $false Get-VDSwitch -Name $MandanVDSwitch | New-VDPortGroup -Name $PGName -NumPorts 1 -VLANID $VlanId Get-VDSwitch -Name $MandanVDSwitch | Get-VDPortGroup | Where-Object {$_.Name -like ("*" + "_" + $VlanId)} | Get-VDUplinkTeamingPolicy | Set-VDUplinkTeamingPolicy -FailoverDetectionPolicy BeaconProbing Get-VDSwitch -Name $MandanVDSwitch | Get-VDPortGroup | Where-Object {$_.Name -like ("*" + "_" + $VlanId)} | Get-VDPortgroupOverridePolicy | Set-VDPortgroupOverridePolicy -BlockOverrideAllowed $false -ResetPortConfigAtDisconnect $false #---------------------------------------------------------------------------------------------------------------------------------------------------- #Delete VMs #Rename VMs for decommission $VMs=@" itdcndstfwp.nd.gov itdcndstfsowp.nd.gov itdcndstfwp1.nd.gov itdcndstfapp1.nd.gov itdcndstfwp2.nd.gov itdcndstfapp2.nd.gov "@ $VMs=ConvertTo-Array -MultiLineString $VMs Remove-ITDVMWareVM -ComputerName $VMs | Select-Object -Property Name,PowerState foreach ($VM in $VMs){ Get-VM | Where-Object -Property Name -Like "$VM*" | Select-Object -Property Name,PowerState } #Delete VM - FINAL DELETE $deleteVM = foreach ($VM in $VMs){ Get-VM | Where-Object -Property Name -Like "$VM*delete*" } $deleteVM.Name $deleteVM | Remove-VM -DeleteFromDisk -Confirm:$false #---------------------------------------------------------------------------------------------------------------------------------------------------- #Replace VMs $VMs = 'itdexchcasbis2.nd.gov','itdexchcasman2.nd.gov','itdcndhehb.nd.gov','itdcndheclnadd.nd.gov' foreach ($VM in $VMs){ $VMold = Get-VM | Where-Object -Property Name -Like "$VM*" | Where-Object -Property PowerState -EQ PoweredOff $VMnew = Get-VM | Where-Object -Property Name -Like "$VM*new*" $VMtags = ($VMold | Get-TagAssignment).Tag | Sort-Object -Unique foreach ($VMtag in $VMtags){ New-TagAssignment -Entity $VMnew -Tag $VMtag } Remove-ITDVMWareVM -ComputerName $VMold.Name Set-VM -VM $VMnew -Name $VMold -Confirm:$false } foreach ($VM in $VMs){ Get-VM | Where-Object -Property Name -Like "$VM*" | Get-TagAssignment } #---------------------------------------------------------------------------------------------------------------------------------------------------- #Datastores $Datastore = 'VMWINDOWS1_138_A9K_R_BNDFISERV' #Rescan Host Cluster Get-Cluster WINDOWS1 | Get-VMHost | Get-VMHostStorage -RescanAllHba -RescanVmfs #Maintenance Mode $Datastore = 'VMPS1_48_A9K_R','VMPS1_49_A9K_R','VMPS1_50_A9K_R','VMPS1_51_A9K_R','VMPS1_52_A9K_R','VMPS1_53_A9K_R' Get-Datastore $Datastore | Set-Datastore -MaintenanceMode $true -EvacuateAutomatically Get-Datastore $Datastore | Set-Datastore -MaintenanceMode $false #Adding Datastores $VMhost = 'itdbisvm-sql01.nd.gov' #Get CanonicalName Get-ScsiLun -VmHost $VMhost -LunType Disk | Select-Object CanonicalName,CapacityGB | Sort-Object CanonicalName #Create Datastore $Datastore = 'VMSQL1_119_A9K_TAX' $CanonicalName = 'naa.6001738ccce06785000000000018ef24' New-Datastore -VMHost $VMhost -Name $Datastore -Path $CanonicalName -VMFS -FileSystemVersion 6 #Removing Datastores #Datastore Unmap $Datastores = 'VMLINUX1_248_V5K_SECLOG','VMLINUX1_249_V5K_SECLOG','VMLINUX1_250_V5K_SECLOG','VMLINUX1_251_V5K_SECLOG' #$Datastores = (Get-DatastoreCluster SQL1_A9K_General | Get-Datastore).Name foreach ($Datastore in $Datastores){ Start-ITDVMwareDatastoreUnmap -Datastore $Datastores } #Expand Datastore $Datastore = Get-Datastore 'VMTEL1_124_A9K_VBRICK' $esxi = Get-View -Id ($Datastore.ExtensionData.Host | Select-Object -Last 1 | Select-Object -ExpandProperty Key) $DatastoreSystem = Get-View -Id $esxi.ConfigManager.DatastoreSystem $ExpandOptions = $DatastoreSystem.QueryVmfsDatastoreExpandOptions($Datastore.ExtensionData.MoRef) $DatastoreSystem.ExpandVmfsDatastore($Datastore.ExtensionData.MoRef,$expandOptions.spec) #Disable Storage I/O Control $Datastores = 'VMWINDOWS1_90_A9K','VMWINDOWS1_91_A9K','VMWINDOWS1_92_A9K','VMSQL1_57_A9K','VMLINUX1_99_A9K_ELASTIC' foreach ($Datastore in $Datastores){ Get-Datastore $Datastore | Set-Datastore -StorageIOControlEnabled $false } #Unmount/Detach #Unmount/Detach Remove-ITDVmwareDatastoreStep1 -LunId 90 #Step2 Storage Admin unmaps LUN from Host #LUN cleanup (after storage unmap, should return empty) Remove-ITDVMwareDatastoreStep3 -LunId 57 Remove-ITDVMwareDatastoreStep3 -LunId 90 Remove-ITDVMwareDatastoreStep3 -LunId 91 Remove-ITDVMwareDatastoreStep3 -LunId 92 Remove-ITDVMwareDatastoreStep3 -LunId 99 $Id = "_90_" $Datastores = Get-Datastore | Where-Object Name -Like ("*_" + $Id + "_*") ForEach ($Datastore in $Datastores) { $SharePointRecord = $null $DatastoreHosts = $Datastore | Get-VMHost $VMHostCanonicalName = (Get-ScsiLun -VmHost ($DatastoreHosts | Select -First 1) | where-object RuntimeName -Like "*$Id*").CanonicalName $SharePointRecord = ($SharePointList | Where-Object Title -eq $Datastore.Name) If ($SharePointRecord.ExtentName -eq $VMHostCanonicalName) { Write-Verbose ($Datastore.Name + " *** " + $VMHostCanonicalName + " *** CanonicalName accurate in SharePoint, continuing with unmount") try { Get-Datastore $Datastore #| Unmount-Datastore $DatastoreHosts | Select-Object -First 1 | Remove-Datastore $Datastore -Confirm:$false -RunASync $DatastoreRemovalSuccess += $Datastore.Name } catch { $DatastoreRemovalFailure += $Datastore.Name } } else { Write-Error ($Datastore.Name + " *** " + " *** CanonicalName mismatch with SharePoint Record") } } #---------------------------------------------------------------------------------------------------------------------------------------------------- #Clusters #Get cluster that VM resides in foreach ($VM in $VMs){ Get-VM $VM | Get-Datastore | Select-Object Name } #Get VMs with Resource Reservations $Cluster = 'TEL1' $VMs = Get-Cluster $Cluster | Get-VM $VMs2 = Get-VM | Where-Object {$_.ExtensionData.ResourceConfig.MemoryAllocation.Reservation -ne "0" -or $_.ExtensionData.ResourceConfig.CpuAllocation.Reservation -ne "0"} #---------------------------------------------------------------------------------------------------------------------------------------------------- #Tags $VMs=@" itdintrpmgrp1.nd.gov "@ $VMs=ConvertTo-Array -MultiLineString $VMs #Spectrum Protect for VE $TagCat = "Backup Management (IBM Spectrum Protect)" $TagName = "Included" #RPO $TagCat = "VR RPO" $TagName = "ABR" $TagName = "RPO 0:15" $TagName = "RPO 0:30" $TagName = "RPO 1:00" $TagName = "RPO 2:00" $TagName = "RPO 4:00" $TagName = "RPO 8:00" #VR Datastores $TagCat = "VR Datastores" $TagName = "VMAVAYA2_210_A9K_VR" $TagName = "VMLINUX2_212_A9K_VR" $TagName = "VMLINUX2_213_A9K_VR" $TagName = "VMSQL2_218_A9K_VR" $TagName = "VMTEL2_220_A9K_VR" $TagName = "VMTEL2_221_A9K_VR" $TagName = "VMWAS2_222_A9K_VR" $TagName = "VMWAS2_223_A9K_VR" $TagName = "VMWINDOWS2_224_A9K_VR" $TagName = "VMWINDOWS2_225_A9K_VR" $TagName = "VMWINDOWS2_226_A9K_VR" #SRM Type $TagCat = "SRM Type" $TagName = "SRM Reserved" $TagName = "SRM Repurposed Suspend" $TagName = "SRM Repurposed" #HA Host $TagCat = "HA" $TagName = "Dedicated HA Host" #Assign Tag foreach ($VM in $VMs){ $VM = Get-VM $VM | Where-Object -Property PowerState -EQ PoweredOn $VIServer = $VM.Uid.split('@')[1].split(':')[0] New-TagAssignment -Entity $VM -Tag (Get-Tag -Server $VIServer -Category $TagCat -Name $TagName) -Server $VIServer } foreach ($VMHost in $VMHosts){ $VMHost = Get-VMHost $VMHost $VIServer = $VMHost.Uid.split('@')[1].split(':')[0] New-TagAssignment -Entity $VMHost -Tag (Get-Tag -Server $VIServer -Category $TagCat -Name $TagName) -Server $VIServer } #---------------------------------------------------------------------------------------------------------------------------------------------------- #VMhosts $VMhosts=@" itdbisvm-av01.nd.gov itdbisvm-av02.nd.gov itdbisvm-av03.nd.gov itdbisvm-av04.nd.gov itdbisvm-av05.nd.gov "@ $VMhosts=ConvertTo-Array -MultiLineString $VMhosts #VMhosts by Cluster $VMhosts = (Get-Cluster | Where-Object -Property Name -EQ WINDOWS1 | Get-VMHost | Sort-Object).Name #Disable Lockdown Mode foreach ($VMhost in $VMhosts){ (Get-VMHost $VMhost | Get-View).ExitLockdownMode() } #Enable Lockdown Mode (Get-VMHost $VMhost | Get-View).EnterLockdownMode() $VMhosts = Get-Datacenter | Where-Object -Property Uid -Like "*itdvmvc*" | Get-VMHost (Get-VMHost $Vmhosts | Get-View).EnterLockdownMode() foreach ($VMhost in $VMhosts){ (Get-VMHost $VMhost | Get-View).EnterLockdownMode() } #Enable SSH services Get-VMHost $VMhost | Get-VMHostService | Where-Object {$_.Label -eq "SSH"} | Start-VMHostService Get-VMHost $VMhost | Get-VMHostService | Where-Object {$_.Label -eq "ESXi Shell"} | Start-VMHostService #Get Lockdown Status for all VMhosts $VMhosts = Get-Datacenter | Where-Object -Property Uid -Like "*itdvmvc*" | Get-VMHost $Lockdown = @{N="Lockdown";E={$_.Extensiondata.Config.adminDisabled}} Get-VMHost $VMhosts | Select-Object Name,$Lockdown #Disable Alarms foreach ($VMhost in $VMhosts){ $disableHost = Get-VMhost $VMhost $viServer = $disableHost.Uid.Split('@')[1].Split(':')[0] $alarmMgr = Get-View AlarmManager -Server $viServer $alarmEnabled = $disableHost.ExtensionData.AlarmActionsEnabled if ($alarmEnabled -eq $true){ $alarmMgr.EnableAlarmActions($disableHost.ExtensionData.MoRef,$false) } $disableHost = $null } #Enable Alarms foreach ($VMhost in $VMhosts){ $enableHost = Get-VMhost $VMhost $viServer = $enableHost.Uid.Split('@')[1].Split(':')[0] $alarmMgr = Get-View AlarmManager -Server $viServer $alarmEnabled = $enableHost.ExtensionData.AlarmActionsEnabled if ($alarmEnabled -eq $false){ $alarmMgr.EnableAlarmActions($enableHost.ExtensionData.MoRef,$true) } $enableHost = $null } #---------------------------------------------------------------------------------------------------------------------------------------------------- #Disk Space $VMs=@" itdcndhhpdb.nd.gov itdcndhhpdbdr.nd.gov itdcndhfpdb.nd.gov itdcndhfpdbdr.nd.gov "@ $VMs=ConvertTo-Array -MultiLineString $VMs $export = 'C:\temp\usedspace.csv' Get-VM $VMs | Select-Object Name,@{n="UsedSpaceGB"; e={[math]::round($_.UsedSpaceGB )}},@{n="ProvisionedSpaceGB"; e={[math]::round($_.ProvisionedSpaceGB )}} -OutVariable Avaya1 | Export-Csv $export Get-VM $VMs | Select-Object Name,@{n="UsedSpaceGB"; e={[math]::round($_.UsedSpaceGB )}},@{n="ProvisionedSpaceGB"; e={[math]::round($_.ProvisionedSpaceGB )}} -OutVariable Avaya1 | Export-Csv $export -Append Get-VM $VMs | Select-Object Name,@{n="UsedSpaceGB"; e={[math]::round($_.UsedSpaceGB )}},@{n="ProvisionedSpaceGB"; e={[math]::round($_.ProvisionedSpaceGB )}} -OutVariable Linux1 | Export-Csv $export -Append Get-VM $VMs | Select-Object Name,@{n="UsedSpaceGB"; e={[math]::round($_.UsedSpaceGB )}},@{n="ProvisionedSpaceGB"; e={[math]::round($_.ProvisionedSpaceGB )}} -OutVariable ODM1 | Export-Csv $export -Append Get-VM $VMs | Select-Object Name,@{n="UsedSpaceGB"; e={[math]::round($_.UsedSpaceGB )}},@{n="ProvisionedSpaceGB"; e={[math]::round($_.ProvisionedSpaceGB )}} -OutVariable PS1 | Export-Csv $export -Append Get-VM $VMs | Select-Object Name,@{n="UsedSpaceGB"; e={[math]::round($_.UsedSpaceGB )}},@{n="ProvisionedSpaceGB"; e={[math]::round($_.ProvisionedSpaceGB )}} -OutVariable WAS1 | Export-Csv $export -Append Get-VM $WindowsVMs | Select-Object Name,@{n="UsedSpaceGB"; e={[math]::round($_.UsedSpaceGB )}},@{n="ProvisionedSpaceGB"; e={[math]::round($_.ProvisionedSpaceGB )}} -OutVariable Windows1 | Export-Csv $export -Append #---------------------------------------------------------------------------------------------------------------------------------------------------- $export = "C:\temp2\usedspace.csv" Export-Csv -Path $export -InputObject $Avaya1 Get-VM $VMs | Select-Object @{n="Cluster"; e={($_ | Get-Cluster).Name}},Name,@{n="UsedSpaceGB"; e={[math]::round($_.UsedSpaceGB )}},@{n="ProvisionedSpaceGB"; e={[math]::round($_.ProvisionedSpaceGB )}} -OutVariable Avaya1 | Export-Csv $export