User Tools

Site Tools


vmware:esx_powercli

Powercli / Vsphere Perl SDK

https://github.com/voletri/PowerCLI-1

http://www.virtu-al.net/script-list/

For Windows you can use PowerShell: powercli
For Linux, use: vSphere Perl SDK

PowerCli Misc commands

Connect to Vcenter (ESX) infrastructure

If you have an error message when starting PowerCLI, open a normal PowerShell as administrator:

Set-ExecutionPolicy RemoteSigned

Measure-Command { Get-VMHost } | fl TotalSeconds

https://msdn.microsoft.com/en-us/powershell/scripting/getting-started/cookbooks/using-format-commands-to-change-output-view

PS> Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -WarningAction SilentlyContinue  -confirm:$false
PS> Connect-VIServer -Server vc01.domain.local -User administrator@vsphere.local -Password ThisIsNotSecure

If you want to use usernames and passwords in text files it is better to use the standard PowerShell stuff for this, the PSCredential object. You can construct a PSCredential object with:

$credentials=Get-Credential

Again, if you don’t want the prompt you can generate it completely on the command line:

$credentials=Get-Credential -UserName administrator@vsphere.local -Message "Enter your vCenter password"

You will get prompted for a password. Now if you want to connect to vCenter you can use:

Connect-VIServer -Server vc01.domain.local -Credential $credentials

If you want to connect to more vCenter servers at the same time, or just don’t like generic connecting there is good news. You can assign the connection object to a variable. With that variable you can do other stuff as shown in the next example:

$vc1 = Connect-VIServer -Server vc01.domain.local -Credential $credentials
Get-VM -Server $vc1

CBT change Block Tracking (for incremental VM backup)

How to implement CBT, what do you need ?

  VM version 7 at least,
  No snapshot on your VM
  Enable CBT,
  Finally the VM must go through a stun-unstun cycle (power on, resume after suspend, migrate, or snapshot create/delete/revert) before the reconfiguration takes effect.

Get VM Power status and CBT (change block tracking)

Connect-Viserver <ip>
login…
passwd….

get-cbt.ps1

#Add-PSSnapin vmware.vimautomation.core
#Connect-Viserver #vcenterserver   
#####################################  
 ## http://kunaludapi.blogspot.com
 ## Version: 1  
 ## Tested this script on  
 ##  1) Powershell v3  
 ##  2) Powercli v5.5  
 ##  3) Vsphere 5.x  
 ####################################
 function Get-VMinventory {  

 }  
   foreach ($vm in (get-vm)) {  
     $props = @{'VMName'=$vm.Name;  
      'PowerState'= $vm.PowerState;  
      'CBTtracking' = (Get-VM -Name $vm).ExtensionData.Config.ChangeTrackingEnabled;
           }  
     $obj = New-Object -TypeName PSObject -Property $Props  
     Write-Output $obj | select-object -Property 'VMName','PowerState','CBTtracking'  
   }  
 Get-VMinventory 

tck_status.ps1

# Find VMs where CBT (Change Block Tracking) is Enabled
write-output "****** CTK Enabled"
Get-VM|Where-Object{$_.ExtensionData.config.ChangeTrackingEnabled -eq $true}
# Find VMs where CBT (Change Block Tracking) is Disabled
write-output "****** No CTK Enabled"
Get-VM|Where-Object{$_.ExtensionData.config.ChangeTrackingEnabled -eq $false}

Change CBT (change block tracking) to enable incremental snapshots

Connect-Viserver <ip>
login…
passwd….

change-cbt.ps1

#Here is aRunning the script on VM to enable CBT
$vmtest = Get-vm TDPVEDM01 | get-view
$vmConfigSpec = New-Object VMware.Vim.VirtualMachineConfigSpec
$vmConfigSpec.changeTrackingEnabled = $true
$vmtest.reconfigVM($vmConfigSpec)

Enable CBT on ALL VM in the Vcenter

enable-cbt-all.ps1

Get-VM | Get-View | foreach {
$spec = New-Object VMware.Vim.VirtualMachineConfigSpec
$spec.changeTrackingEnabled = $true
$taskMoRef = $_.ReconfigVM_Task($spec)
}

http://www.virtu-al.net/script-list/

Script to count path per disk

Connect to the VCenter

PS> Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -WarningAction SilentlyContinue  -confirm:$false
PS> Connect-VIServer -Server vc01.domain.local -User administrator@vsphere.local -Password ThisIsNotSecure

Rescan all hosts

PS> Get-VMHost | Get-VMHostStorage -RescanAllHba

Rescan all hosts in a cluster:

PS> Get-Cluster -Name “ProVMware” | Get-VMHost | Get-VMHostStorage -RescanAllHba

Get Datastore paths and UUID (LUN ID)

Show the actual count of the active paths per datastore.

# Start Get all Connected Hosts
$myHosts = Get-VMHost | where {$_.ConnectionState  -eq "Connected" -and $_.PowerState -eq "PoweredOn"}

foreach($esx in $myHosts){
  $hss = Get-View $esx.Extensiondata.ConfigManager.StorageSystem

  $lunTab = @{}
  $hss.StorageDeviceInfo.ScsiLun | %{
    $lunTab.Add($_.Key,$_.CanonicalName)
  }
  $pathTab = @{}
  $hss.StorageDeviceInfo.MultipathInfo.Lun | %{
    $pathState = @($_.Path | Group-Object -Property PathState |
    where {$_.Name -eq "active"} | Select -ExpandProperty Group)

    if($pathTab.ContainsKey($_.Lun)){
      $pathTab[$_.Lun] += $pathState.Count
    }
    else{
      $pathTab.Add($lunTab[$_.Lun],$pathState.Count)
    }
  }

  foreach($mount in ($hss.FileSystemVolumeInfo.MountInfo | where {$_.Volume.Type -eq "VMFS"})){
    $mount.Volume.Extent |
    Select @{N="VMHost";E={$esx.Name}},
      @{N="Datastore";E={$mount.Volume.Name}},
      @{N="LUN";E={$_.DiskName}},
      @{N="Active Paths";E={$pathTab[$_.DiskName]}}
  } 
}

Output:

VMHost                 Datastore         LUN                                  Active Paths
------                 ---------         ---                                  ------------
esxa100.labo.lu        SVC_DATASTORE_06  naa.60050768025186646800000000000386            2
esxa100.labo.lu        Local-ESXA100     naa.600508b3301c5424e056c2fd39ab577b            1
esxa100.labo.lu        SVC_DATASTORE_04  naa.600507680251866468000000000003af            2

Count storage paths

Show the actual count of the paths per HBA.

# Start Get all Connected Hosts
$myHosts = Get-VMHost | where {$_.ConnectionState  -eq "Connected" -and $_.PowerState -eq "PoweredOn"}

foreach($esx in $myHosts){
    foreach($hba in (Get-VMHostHba -VMHost $esx -Type "FibreChannel")){
        $target = ((Get-View $hba.VMhost).Config.StorageDevice.ScsiTopology.Adapter | where {$_.Adapter -eq $hba.Key}).Target
        $luns = Get-ScsiLun -Hba $hba  -LunType "disk" -ErrorAction SilentlyContinue
        $nrPaths = ($target | %{$_.Lun.Count} | Measure-Object -Sum).Sum
        $props = [ordered]@{
            VMHost = $esx.name
            HBA = $hba.Name
            Targets = $target.Count
            Devices = $luns.Count
            Paths = $nrPaths
        }
        New-Object PSObject -Property $props | ft -AutoSize
    }
} 

Output:

VMHost                 HBA    Targets Devices Paths
------                 ---    ------- ------- -----
esxa111.labo.lu vmhba0       6      89   178

Or more compact

# Start Get all Connected Hosts
$myHosts = Get-VMHost | where {$_.ConnectionState  -eq "Connected" -and $_.PowerState -eq "PoweredOn"}

foreach($esx in $myHosts){
    foreach($hba in (Get-VMHostHba -VMHost $esx -Type "FibreChannel")){
     $target = ((Get-View $hba.VMhost).Config.StorageDevice.ScsiTopology.Adapter | where {$_.Adapter -eq $hba.Key}).Target
     $luns = Get-ScsiLun -Hba $hba  -LunType "disk"
     $nrPaths = ($target | %{$_.Lun.Count} | Measure-Object -Sum).Sum
     Write-Host $esx $hba.Device "Targets:" $target.Count "Devices:" $luns.Count "Paths:" $nrPaths
     }
}

Output:

esxa100.labo.lu vmhba2 Targets: 2 Devices: 9 Paths: 18
esxa100.labo.lu vmhba3 Targets: 2 Devices: 9 Paths: 18
esxb101.labo.lu vmhba2 Targets: 2 Devices: 9 Paths: 18
esxb101.labo.lu vmhba3 Targets: 2 Devices: 9 Paths: 18

Get IPs for VMotion interfaces

$Array = @()
$Clusters = Get-Cluster | Sort Name
ForEach ($Cluster in $Clusters){
$VmHosts = $Cluster | Get-VmHost | Where {$_.ConnectionState -eq “Connected”} | Sort Name
ForEach ($VmHost in $VmHosts){
$Array += Get-VMHostNetworkAdapter -VMHost $VmHost.Name -VMKernel | Where {$_.VMotionEnabled -eq “True”} | select VmHost,IP
}
}
$Array | Out-GridView

Remove old VMs

Script to remove 30 days old powered off vm guest from vCenter automatically and email user about it

$vms = Get-VM | where {$_.PowerState -eq "PoweredOff"}
$vmPoweredOff = $vms | %{$_.Name}
$events = Get-VIEvent -Start (Get-Date).AddDays(-30) -Entity $vms | where{$_.FullFormattedMessage -like "*is powered off"}
$lastMonthVM = $events | %{$_.Vm.Name}
$moreThan1Month = $vmPoweredOff | where {!($lastMonthVM -contains $_)} 

$moreThan1Month | Remove-VM -DeletePermanently -Confirm:$false
$vmNames = $moreThan1Month | Select -ExpandProperty Name

Send-MailMessage -From report@domain.com -To me@domain.com -SmtpServer mail@domain.com -Subject "Removed $($moreThan1Month.Count) VM" -Body ($vmNames | Out-String)

List VM with RAW disks

PS1> Get-VM | Get-HardDisk -DiskType "RawPhysical","RawVirtual" | Select Parent,Name,DiskType,ScsiCanonicalName,DeviceName | fl | Out-File –FilePath RDM-list.txt

Commands

Collecting information about virtual machine hardware

To get a list of all the virtual machines in the inventory and their name, power state, number of CPUs, and configured memory, run the cmdlet:

PS1> Get-VM
Name PowerState Num CPUs Memory (MB)
---- ---------- -------- -----------
NW PoweredOff 1 512
PowerCLI PoweredOn 1 1024

Note: This command provides information about the version, virtual hardware attached (virtual disk, network, CD-ROM), datastore, host, High Availability restart, and isolation properties:

PS1> Get-VM windows-dc | Format-List *

Collecting information about the virtual machine guest operating system

vSphere PowerCLI provides cmdlets to retrieve the details about the virtual machine guest operating system. These cmdlets are independent of the guest operating system installed in the virtual machine.

PS1> Get-VMGuest -VM windows-dc | Format-List *

OSFullName : Microsoft Windows Server 2003, Enterprise Edition (64-bit)
IPAddress : {IP_Address}
State : Running
HostName : windows-dc.vcd.com
Nics : {}
ScreenDimensions : {Width=1024, Height=768}

Note: When retrieving the details about the guest operating system, you are prompted for the user name and password for the ESX/ESXi host and guest operating system. You can provide the authentication details in the command by using the -HostUser root -HostPassword pass1 -GuestUser administrator -GuestPassword vmware123 parameters.

Using PowerCLI, you can also query, start, or stop a service within the guest operating system. You can use Start-Service, Stop-Service, and Restart-Service cmdlets to modify the status of the service. If no virtual machine is specified in the command the change is be made on all the Windows virtual machines in the inventory.

Note: To use this command ensure that the latest version of VMware Tools are installed on the virtual machine and this cmdlet is applicable only for Windows guest.

PS1> Get-VM windows-dc | Invoke-VMScript "Get-Service app*"
 
Status Name DisplayName
------ --- -----------
Stopped AppMgmt Application Management

vSphere PowerCLI also provides cmdlets to provide the network configuration information from within the guest operating system:

PS1> Get-VMGuestNetworkInterface -VM windows-dc -HostUser root -HostPassword vmware123 -GuestUser administrator -GuestPassword vmware123

VMId : VirtualMachine-vm-33
VM : windows-dc
NetworkAdapter : Network adapter 1
SubnetMask : 255.255.255.0
NicId : VirtualMachine-vm-33/4000
Name : Local Area Connection
IPPolicy : Static
Ip : IP_Address
Dns : {IP_Address}
DefaultGateway : 192.168.0.2
Description : Intel(R) PRO/1000 MT Network Connection
Mac : MAC_Address
RouteInterfaceId : 0x10003
Uid : /VIServer=@xx.xx.xx.xx:443/VMGuestNetworkInterface=00-11-22
-aa-bb-cc/
DnsPolicy : Static
WinsPolicy : Static
Wins :

To retrieve the routing configuration of the specified virtual machine, run the cmdlet:

PS1> Get-VMGuestroute -VM windows-dc -HostUser root -HostPassword vmware123 -GuestUser administrator -GuestPassword vmware123

Destination : 0.0.0.0
Gateway : 192.168.0.2
Interface : IP_Address
Netmask : 255.255.255.0
VMId : VirtualMachine-vm-33
VM : windows-dc

Configuring a virtual machine using PowerCLI

This section discusses the cmdlets that you can use to configure/reconfigure the virtual machines.

To create new virtual machines, run the cmdlet:

PS1> New-VM -VMHost xx.xx.xx.xx -Name TestCli -MemoryMB 1024 -DiskMB 8024
 
Name PowerState Num CPUs Memory (MB)
---- ---------- -------- - ----------
TestCli PoweredOff 1 1024

To migrate a virtual machine using vMotion, run the cmdlet:

PS1> Get-VMHost xx.xx.xx.xx | Get-VM "windows-cli" | Move-VM -Destination xx.xx.xx.xx
 
Name PowerState Num CPUs Memory (MB)
---- ---------- -------- -----------
windows-cli PoweredOn 1 1024

To migrate a virtual machine using Storage vMotion, run the cmdlet:

PS1> Get-VM windows-rhel5 | Move-VM -Datastore vCloud-1
 
Name PowerState Num CPUs Memory (MB)
---- ---------- -------- -----------
windows-rhel5 PoweredOn 1 3072

All of the virtual machines in the in the inventory can be configured with or without the CD-ROM drive using this command:

Note: To disable CD-ROM, use the $false option. To enable CD-ROM, use the $true option. [

PS1> Get-VM | Get-CDDrive | Set-CDDrive -Connected:$false
 
Confirm
Are you sure you want to perform this action?
Performing operation "Setting Connected: False, NoMedia: False." on Target "CD/DVD Drive 1".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):Y

If you would like to remove confirmation option, then add this at the end of commandlet “-Confirm:$false”, this is an example:

PS1> Get-VM | Get-CDDrive | Set-CDDrive -Connected:$false -confirm:$false

Working with virtual machine snapshots

vSphere PowerCLI provides cmdlets to create/remove snapshots for all of the virtual machines in the inventory. However, you may further customize the command to specify virtual machines from a specific ESX/ESXi host, cluster, or datacenter.

To take a new snapshot for all virtual machines in a cluster, run the cmdlet:

PS1> Get-Cluster "vCloud" | Get-VM | New-Snapshot -Name Automate
 
Name Description PowerState
---- ----------- ----------
Automate PoweredOff
Automate PoweredOff

To remove a snapshot from all of the virtual machine in the inventory, run the cmdlet:

PS1> Get-VM | Get-Snapshot | Remove-Snapshot
 
Confirm
Are you sure you want to perform this action?
Performing operation "Removing snapshot." on Target
"VirtualMachineSnapshot-snapshot-174".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help
(default is "Y"):A

To remove a confirmation option, add this at the end of commandlet:

  -Confirm:$false

For example:

PS1> Get-VM | Get-Snapshot | Remove-Snapshot -Confirm:$false

Note: Use these commands with caution as the changes made are applicable for all virtual machines.

Updating VMware Tools

Update-Tools cmdlets can be used to update the VMware Tools on a single or multiple virtual machines. This command reboots the virtual machine after updating the VMware Tools. You can use the -NoReboot option to update the VMware Tools without rebooting the virtual machine.

In this example, the VMware Tools for all of the virtual machines in Resource Pool vCloud are updated without rebooting the virtual machine:

PS1> Get-ResourcePool vcloud | Get-VM | Update-Tools -NoReboot
WARNING: Automatic update of VMware tools is not fully supported for
non-Windows OSs. Manual intervention might be required.

Note: Before running the cmdlet, ensure that the VMware Tools service is running. This command is used only to upgrade VMware Tools. To do an unattended install, use msiexec.exe. For more information, see the Microsoft article Command

vmware/esx_powercli.txt · Last modified: 2022/09/20 22:40 by manu