From 84cf5bcd4d94986933453bbc23d1803055d87511 Mon Sep 17 00:00:00 2001 From: vtagion Date: Thu, 24 Sep 2015 21:27:20 -0600 Subject: [PATCH] PowerCLI Scripts added a number of scripts that cover a handful of areas. --- Check-VMwareTools.ps1 | 36 ++++++++++++++ ExportImportTags.ps1 | 65 +++++++++++++++++++++++++ Get-BiosBootStatus.ps1 | 42 ++++++++++++++++ Install-HostClient.ps1 | 108 +++++++++++++++++++++++++++++++++++++++++ Invoke-BiosBoot.ps1 | 55 +++++++++++++++++++++ Remove-HostClient.ps1 | 51 +++++++++++++++++++ Remove-IPPool.ps1 | 38 +++++++++++++++ 7 files changed, 395 insertions(+) create mode 100644 Check-VMwareTools.ps1 create mode 100644 ExportImportTags.ps1 create mode 100644 Get-BiosBootStatus.ps1 create mode 100644 Install-HostClient.ps1 create mode 100644 Invoke-BiosBoot.ps1 create mode 100644 Remove-HostClient.ps1 create mode 100644 Remove-IPPool.ps1 diff --git a/Check-VMwareTools.ps1 b/Check-VMwareTools.ps1 new file mode 100644 index 0000000..70bd552 --- /dev/null +++ b/Check-VMwareTools.ps1 @@ -0,0 +1,36 @@ +function Check-Tools { +<# + .NOTES + =========================================================================== + Created by: Brian Graf + Organization: VMware + Official Blog: blogs.vmware.com/PowerCLI + Personal Blog: www.vtagion.com + Twitter: @vBrianGraf + =========================================================================== + .DESCRIPTION + This will quickly return all VMs that have VMware Tools out of date + Along with the version that it is running + .Example + Check-Tools -VMs (Get-VM) + .Example + $SampleVMs = Get-VM "Mgmt*" + Check-Tools -VMs $SampleVMs +#> + [CmdletBinding()] + param( + [Parameter(Mandatory=$true, + ValueFromPipeline=$True, + Position=0)] + [VMware.VimAutomation.ViCore.Impl.V1.Inventory.InventoryItemImpl[]] + $VMs + ) +Process { +#foreach ($VM in $VMs) { +$OutofDate = $VMs | where {$_.ExtensionData.Guest.ToolsStatus -ne "toolsOk"} +$Result = @($OutofDate | select Name,@{Name="ToolsVersion";Expression={$_.ExtensionData.Guest.Toolsversion}}) + +$Result +} + +} \ No newline at end of file diff --git a/ExportImportTags.ps1 b/ExportImportTags.ps1 new file mode 100644 index 0000000..e6a1ec7 --- /dev/null +++ b/ExportImportTags.ps1 @@ -0,0 +1,65 @@ +function Export-Tag { + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $True, Position = 1)] + [VMware.VimAutomation.ViCore.Types.V1.VIServer]$Server, + + [Parameter(Mandatory = $True, Position = 2)] + [string]$Destination + ) + + # Retrieve all categories + $categoryList = Get-TagCategory -Server $server + # Retrieve all tags + $tagList = Get-Tag -Server $server + # Store the tags and categories in a list to export them at once + $export = @($categoryList, $tagList) + # Export the tags and categories to the specified destination + Export-Clixml -InputObject $export -Path $destination +} + +function Import-Tag { + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $True, Position = 1)] + [VMware.VimAutomation.ViCore.Types.V1.VIServer]$Server, + + [Parameter(Mandatory = $True, Position = 2)] + [string]$Source + ) + + # Import the tags and categories from the specified source + $import = Import-Clixml -Path $source + # Divide the input in separate lists for tags and categories + $categoryList = $import[0] + $tagList = $import[1] + + # Store the newly created categories to avoid retrieving them later + $categories = @() + + # First create all categories on the server + foreach ($category in $categoryList) { + $categories += ` + New-TagCategory ` + -Name $category.Name ` + -Description $category.Description ` + -Cardinality $category.Cardinality ` + -EntityType $category.EntityType ` + -Server $server ` + | Out-Null + } + + # Then create all tags in the corresponding categories + foreach ($tag in $tagList) { + # Find the category object in the list + $category = $categories | where {$_.Name -eq $tag.Category.Name} + if ($category -eq $null) {$category = $tag.Category.Name} + + New-Tag ` + -Name $tag.Name ` + -Description $tag.Description ` + -Category $category ` + -Server $server ` + | Out-Null + } +} \ No newline at end of file diff --git a/Get-BiosBootStatus.ps1 b/Get-BiosBootStatus.ps1 new file mode 100644 index 0000000..f104ee0 --- /dev/null +++ b/Get-BiosBootStatus.ps1 @@ -0,0 +1,42 @@ +function Get-BiosBootStatus { +<# + .NOTES + =========================================================================== + Created by: Brian Graf + Organization: VMware + Official Blog: blogs.vmware.com/PowerCLI + Personal Blog: www.vtagion.com + Twitter: @vBrianGraf + =========================================================================== + .DESCRIPTION + This will return the boot status of Virtual Machines, whether they + are booting to the Guest OS or being forced to boot into BIOS. + .Example + # Returns all VMs and where they are booting + Get-BiosBootStatus -VMs (Get-VM) + .Example + # Only returns VMs that are booting to BIOS + Get-BiosBootStatus (Get-VM) -IsSetup + +#> + [CmdletBinding()] + param( + [Parameter(Mandatory=$true, + ValueFromPipeline=$True, + Position=0)] + [VMware.VimAutomation.ViCore.Impl.V1.Inventory.InventoryItemImpl[]] + $VM, + [switch]$IsSetup + ) +Process { + if($IsSetup) + { + $Execute = $VM | where {$_.ExtensionData.Config.BootOptions.EnterBiosSetup -eq "true"} | Select Name,@{Name="EnterBiosSetup";Expression={$_.ExtensionData.config.BootOptions.EnterBiosSetup}} + } + else + { + $Execute = $VM | Select Name,@{Name="EnterBiosSetup";Expression={$_.ExtensionData.config.BootOptions.EnterBiosSetup}} + } +} +End {$Execute} +} \ No newline at end of file diff --git a/Install-HostClient.ps1 b/Install-HostClient.ps1 new file mode 100644 index 0000000..c41e6ef --- /dev/null +++ b/Install-HostClient.ps1 @@ -0,0 +1,108 @@ +function install-HostClient { +<# + .NOTES + =========================================================================== + Created on: 8/13/2015 9:12 AM + Created by: Brian Graf + Github: http://www.github.com/vtagion + Twitter: @vBrianGraf + Website: http://www.vtagion.com + =========================================================================== + .DESCRIPTION + This advanced function will allow you to install the ESXi Host Client + On all the hosts in a specified cluster. + .Example + Install-HostClient -Cluster (Get-Cluster Management-CL) -Datastore (Get-Datastore NFS-SAS-300GB-A) -vibfullpath c:\temp\esxui-2976804.vib + + .Example + $ds = Get-Datastore Main-shared + $Cluster = Main-CL + Install-HostClient -Cluster $cluster -Datastore $ds -vibfullpath c:\temp\esxui-2976804.vib + + .Notes + You must use shared storage for this to work correctly, otherwise only a single host will be able to install the vib and all others will fail +#> +[CmdletBinding()] +param( +[Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true,HelpMessage="Must be shared storage across all hosts")] + [ValidateScript({Get-Datastore $_})] + [VMware.VimAutomation.ViCore.Impl.V1.DatastoreManagement.NasDatastoreImpl]$Datastore, + +[Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true,HelpMessage="Please specify a Cluster object")] + [ValidateScript({Get-Cluster $_})] + [VMware.VimAutomation.ViCore.Impl.V1.Inventory.ComputeResourceImpl]$Cluster, + +[Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true,HelpMessage="Specify the full path of the ESXi Host Client Vib")] + [ValidateScript({Get-Item $_})] + [String]$vibfullpath +) +Begin { + +$VIBFile = Get-item $vibfullpath -ErrorAction SilentlyContinue + +# Verify that VIB location is correct +if ($VIBFile -eq $null){Throw "oops! looks like $VIBFile doesn't exist in this location."} + +# Save filename to variable +$VIBFilename = $vibfile.PSChildname + +# Save datacenter to variable for Datastore path +$dc = $Cluster | Get-Datacenter + +#Get-Datastore -Name $Datastore + +# Create Datastore Path string +$Datastorepath = "vmstore:\" + $dc + "\" + $Datastore.Name + "\" + +# Verbose info for debugging +Write-verbose "DatastorePath = $Datastorepath" +Write-verbose "Vibfile = $vibfile" +Write-verbose "Vibfullpath = $vibfullpath" +Write-verbose "VibFilename = $VIBFilename" + +# check to see if file already exists or not before copying +if (!(Test-Path -Path $Datastorepath)) { +Copy-DatastoreItem $vibfile $Datastorepath -Force +} + +# validate the copy worked. If not, stop script +if (!(Test-Path -Path $Datastorepath)) { +Throw "Looks like the VIB did not copy to $Datastorepath. Check the filename and datastore path again and rerun this function." +} + +# Create VIB path string for ESXCLI +$VIBPATH = "/vmfs/volumes/" + $datastore.name + "/" + "$VIBFilename" + +} + +Process { + + +#$VIBPATH = "/vmfs/volumes/NFS-SAS-300GB-A/esxui-2976804.vib" + +# Get each host in specified cluster that meets criteria +Get-VMhost -Location $Cluster | where { $_.PowerState -eq "PoweredOn" -and $_.ConnectionState -eq "Connected" } | foreach { + + Write-host "Preparing $($_.Name) for ESXCLI" -ForegroundColor Yellow + + # Create ESXCLI variable for host for actions + $ESXCLI = Get-EsxCli -VMHost $_ + + # Check to see if ESX-UI is already installed + if (($ESXCLI.software.vib.list() | Select AcceptanceLevel,ID,InstallDate,Name,ReleaseDate,Status,Vendor,Version | Where {$_.Name -match "esx-ui"})) {Write-host "It appears ESX-UI is already installed on $_. Skipping..." -ForegroundColor Yellow} else { + + Write-host "Installing ESXi Embedded Host Client on $($_.Name)" -ForegroundColor Yellow + + # Saving command to variable to use for verification after command is run + $action = $ESXCLI.software.vib.install($null,$null,$null,$null,$null,$null,$null,$null,$VIBPATH) + + # Verify VIB installed successfully + if ($action.Message -eq "Operation finished successfully."){Write-host "Action Completed successfully on $($_.Name)" -ForegroundColor Green} else {Write-host $action.Message -ForegroundColor Red} + } +} +} +End { +Write-host "Function Complete" -ForegroundColor Green +Write-Host "You may access your hosts at https:///ui" -ForegroundColor Green +} +} \ No newline at end of file diff --git a/Invoke-BiosBoot.ps1 b/Invoke-BiosBoot.ps1 new file mode 100644 index 0000000..30ccc70 --- /dev/null +++ b/Invoke-BiosBoot.ps1 @@ -0,0 +1,55 @@ +function Invoke-BiosBoot { +<# + .NOTES + =========================================================================== + Created by: Brian Graf + Organization: VMware + Official Blog: blogs.vmware.com/PowerCLI + Personal Blog: www.vtagion.com + Twitter: @vBrianGraf + =========================================================================== + .DESCRIPTION + This function allows you to set a VM to boot into BIOS or Guest OS + .Example + # Set a VM to boot to BIOS + Invoke-BiosBoot -VMs (Get-VM) -Bios + .Example + Invoke-BiosBoot -VMs (Get-VM) -OS +#> + [CmdletBinding()] + param( + [Parameter(Mandatory=$true, + ValueFromPipeline=$True, + Position=0)] + [VMware.VimAutomation.ViCore.Impl.V1.Inventory.InventoryItemImpl[]] + $VM, + [switch]$Bios, + [switch]$OS + ) +Process { + if($Bios) + { + Foreach ($VirtualMachine in $VM) { + $object = New-Object VMware.Vim.VirtualMachineConfigSpec + $object.bootOptions = New-Object VMware.Vim.VirtualMachineBootOptions + $object.bootOptions.enterBIOSSetup = $true + + $Reconfigure = $VirtualMachine | Get-View + $Reconfigure.ReconfigVM_Task($object) + $Return + } + } + if($OS) + { + Foreach ($VirtualMachine in $VM) { + $object = New-Object VMware.Vim.VirtualMachineConfigSpec + $object.bootOptions = New-Object VMware.Vim.VirtualMachineBootOptions + $object.bootOptions.enterBIOSSetup = $false + + $Reconfigure = $VirtualMachine | Get-View + $Reconfigure.ReconfigVM_Task($object) + $Return + } + } +} +} \ No newline at end of file diff --git a/Remove-HostClient.ps1 b/Remove-HostClient.ps1 new file mode 100644 index 0000000..86ffdbc --- /dev/null +++ b/Remove-HostClient.ps1 @@ -0,0 +1,51 @@ +function Remove-HostClient { +<# + .NOTES + =========================================================================== + Created on: 8/13/2015 9:12 AM + Created by: Brian Graf + Github: http://www.github.com/vtagion + Twitter: @vBrianGraf + Website: http://www.vtagion.com + =========================================================================== + .DESCRIPTION + This advanced function will allow you to remove the ESXi Host Client + on all the hosts in a specified cluster. + .Example + Remove-HostClient -Cluster (Get-Cluster Management-CL) + + .Example + $Cluster = Main-CL + Remove-HostClient -Cluster $cluster +#> +[CmdletBinding()] +param( + [ValidateScript({Get-Cluster $_})] + [VMware.VimAutomation.ViCore.Impl.V1.Inventory.ComputeResourceImpl]$Cluster +) +Process { + +# Get all ESX hosts in cluster that meet criteria +Get-VMhost -Location $Cluster | where { $_.PowerState -eq "PoweredOn" -and $_.ConnectionState -eq "Connected" } | foreach { + + Write-host "Preparing to remove Host Client from $($_.Name)" -ForegroundColor Yellow + + # Prepare ESXCLI variable + $ESXCLI = Get-EsxCli -VMHost $_ + + # Check to see if VIB is installed on the host + if (($ESXCLI.software.vib.list() | Where {$_.Name -match "esx-ui"})) { + + Write-host "Removing ESXi Embedded Host Client on $($_.Name)" -ForegroundColor Yellow + + # Command saved to variable for future verification + $action = $esxcli.software.vib.remove($null,$null,$null,$null,"esx-ui") + + # Verify VIB removed successfully + if ($action.Message -eq "Operation finished successfully."){Write-host "Action Completed successfully on $($_.Name)" -ForegroundColor Green} else {Write-host $action.Message -ForegroundColor Red} + + } else { Write-host "It appears Host Client is not installed on this host. Skipping..." -ForegroundColor Yellow } +} +} +End {Write-host "Function complete" -ForegroundColor Green} +} diff --git a/Remove-IPPool.ps1 b/Remove-IPPool.ps1 new file mode 100644 index 0000000..746ef9d --- /dev/null +++ b/Remove-IPPool.ps1 @@ -0,0 +1,38 @@ +Function Remove-IPPool { + <# + .Synopsis + This function will remove IP-Pools from vCenter + .Description + This function will remove IP-Pools from vCenter based on the inputs provided + .Example + Assuming my datacenter was 'westwing' and my IPPool was 'IPPool1' + remove-ippool westwing IPPool1 + .Notes + Author: Brian Graf + Role: Technical Marketing Engineer, VMware + Last Edited: 05/01/2014 + + #> + [cmdletbinding()] + Param ( + [Parameter(ValueFromPipeline = $true, valuefrompipelinebypropertyname = $true)] + [String]$Datacenter, + [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] + [String]$PoolName + ) + + Process { + $dc = (Get-datacenter $Datacenter) + $dcenter = New-Object VMware.Vim.ManagedObjectReference + $dcenter.type = $dc.ExtensionData.moref.type + $dcenter.Value = $dc.ExtensionData.moref.value + + $IPPoolManager = Get-View -Id 'IpPoolManager' + $SelectedPool = ($IPPoolManager.QueryIpPools($dc.ID) | Where-Object { $_.Name -like $PoolName }) + + $IPPool = Get-View -Id 'IpPoolManager-IpPoolManager' + $IPPool.DestroyIpPool($dcenter, $SelectedPool.id, $true) + + } +} +