VI-ToolBox PowerCLI PowerShell Module
Recently I decided to migrate some of the PowerCLI (http://communities.vmware.com/community/vmtn/server/vsphere/automationtools/powercli) scripts I use for managing the lab at work and when I consult in infrastructure in to a module so as to make it easier for me to maintain. Also placed the module in GitHub so I can use git to keep it updated between my machines. The module can be found in https://github.com/darkoperator/VI-ToolBox
For using the module you just download the files in to a folder called VI-Toolbox in any of the that PowerShell v2 and v3 look in to for modules. You can list the folder by looking at the variable inside a PowerShell session:
C:\Users\Carlos> $env:PSModulePath C:\Users\Carlos\Documents\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
Once downloaded the files must be unlocked since Windows tends to block all PowerShell files downloaded from the web. If using PowerShell v2 you will have to right click on each file, going to properties and click on Unblock. In PowerShell v3 we can use the Unblock-File cmdlet with the following command:
Get-ChildItem $env:HOME\Documents\WindowsPowerShell\Modules\VI-Toolbox\* | Unblock-File
Lets start by importing the module and listing the functions we have available:
C:\Users\Carlos> Import-Module VI-ToolBox C:\Users\Carlos> Get-Command -Module VI-Toolbox CommandType Name ModuleName ----------- ---- ---------- Function Disconnect-VIMSession VI-ToolBox Function Get-VIMSessions VI-ToolBox Function Get-VIUserEvents VI-ToolBox Function Get-VMConsoleConnectionCount VI-ToolBox Function Get-VMEvents VI-ToolBox Function Get-VMMountedCDRom VI-ToolBox Function Get-VMToolStatus VI-ToolBox Function Search-VMIPAddress VI-ToolBox Function Search-VMMacAddress VI-ToolBox Function Search-VMOldSnapshots VI-ToolBox
Before we can use the functions we must connect to a vCenter server that manages the ESX/ESXi servers. For this we use the Connect-VIServer cmdlet offered by PowerCLI
C:\Users\Carlos> Connect-VIServer -Server vcenter Name Port User ---- ---- ---- vcenter 443 administrator
Once connected we can start working with the functions in the module.
Finding a VM given its IP Address
Many times in a virtual infrastructure we may find our selfs trying to find a VM with a given IP Address Specially when that VM is mis-behaving. To search for a VM the Search-VMIPAddress is available, we can give this function either a group of VMs thru the pipeline using the Get-VM cmdlet or if no VM Object is given it will search against all. Now vCenter uses the information given by the VMware Tools so they need to be installed and running on the host we are looking for:
C:\Users\Carlos> Search-VMIPAddress -IPAddress 192.168.10.10 VMName VMHost IPAddress ------ ------ --------- ALAB-DC01 labesxi01.darkoperator.com 192.168.10.10
Finding VM's given their MAC Address
Some times users will not install VMware Tools on their hosts, they might not support them or simply the service is not running. We can look for the VM given its MAC Address with the Search-VMMacAddress Function:
C:\Users\Carlos> Search-VMMacAddress -MAC 00:0c:29:eb:df:67 VMName : ALB-DC02 VMHost : labesxi01.darkoperator.com AddapterName : Network adapter 1 NetworkName : VM Network MacAddress : 00:0c:29:eb:df:67
Working with User Sessions
One of the things I always keep an eye out is for who is connecting to the server and to kill any old sessions for this I wrote 2 functions one call Get-VIMSessions and the other Disconnect-VIMSessions. In the following example I have 2 sessions for the Administrator user, one is our current session the other is a previous one that is Idle:
C:\Users\Carlos> Get-VIMSessions UserName : Administrator FullName : Status : Idle Key : 523ce38c-3fe5-d0d5-da47-8354f3a0c8ef LoginTime : 4/12/2013 6:35:40 PM LastActiveTime : 4/12/2013 6:39:45 PM UserName : Administrator FullName : Status : Current Session Key : 52dcfcc9-a945-631f-c993-0e72c9e8fd08 LoginTime : 4/12/2013 6:41:53 PM LastActiveTime : 4/12/2013 6:41:53 PM
Now we see that in Status we can see what session is our current one in the case of several sessions with the same name. We disconnect sessions using the session key as the way to identify the session we want to kill:
C:\Users\Carlos> Disconnect-VIMSession -Key 523ce38c-3fe5-d0d5-da47-8354f3a0c8ef True C:\Users\Carlos> Get-VIMSessions UserName : Administrator FullName : Status : Current Session Key : 52dcfcc9-a945-631f-c993-0e72c9e8fd08 LoginTime : 4/12/2013 6:41:53 PM LastActiveTime : 4/12/2013 6:43:11 PM
Finding VMs with mounted ISO Images
One of the problems of many VMware Admins that have DRS is when their VM's have mounted CDROM Images and prevents the VMs from moving from one vmhosts to the next. For finding this VMs the Get-VMMountedCDRom function can be used against a given collection of VMs or against all, here is an ugly example:
C:\Users\Carlos> Get-VMMountedCDRom Name ISO file ---- -------- v-win2k81 ALAB-DC01 [isostore] Microsoft/OS/en_windows_server_2012_x64_dv... OEL6 [] /usr/lib/vmware/isoimages/linux.iso v-win2k82 v-win2k3 NSEC_DOM [isostore] Microsoft/en_windows_server_2012_x64_dvd_9... fedora [isostore] Linux/Fedora-18-x86_64-DVD.iso ALAB-WinXP01 [isostore] Microsoft/OS/en_windows_xp_service_pack_3_... Win7-tmpl x64 Win2k8 [isostore] Microsoft/en_windows_server_2008_datacente... vuln-win2k8r2 win2k3-vmtest [isostore] win2k3entsp2.iso ALAB-LOGSRV [isostore] Microsoft/OS/en_windows_server_2008_r2_sta... ALAB-Win801 [isostore] Microsoft/OS/en_windows_8_enterprise_x64_d... win2k3-tmpl x86 ALAB-Win802 [isostore] Microsoft/OS/en_windows_8_enterprise_x64_d... ALAB-WinXP02 [isostore] Microsoft/OS/en_windows_xp_service_pack_3_... ESXi5.1-01 [isostore] VMWare/VMware-VMvisor-Installer-5.1.0-7997... MSFRH [] /usr/lib/vmware/isoimages/linux.iso NessusScanner [] /usr/lib/vmware/isoimages/linux.iso vuln-xp ALB-Exch10 [isostore] Microsoft/Exchange/mu_exchange_server_2010... OSX Lion [isostore] Apple/OSX.LION.GM.iso WinXP-tmpl-x86 win2k301 [isostore] win2k3entsp2.iso win2k302 [isostore] win2k3entsp2.iso Xenserver [isostore] XenServer-6.1-install-cd.iso Win2k8R2-core-tmpl x64 Debian6 [] /usr/lib/vmware/isoimages/linux.iso Ubuntusrv [isostore] Linux/ubuntu-12.04.1-server-amd64.iso ALAB-WSUS [isostore] Microsoft/OS/en_windows_server_2012_x64_dv... vuln-7 ALAB-Win702 [isostore] Microsoft/OS/en_windows_7_ultimate_with_sp... win2k81 ALAB-Win701 [isostore] Microsoft/OS/en_windows_7_enterprise_x64_d... CentOS6x64 [] /usr/lib/vmware/isoimages/linux.iso Win2k82 test2centos [isostore] Linux/CentOS-6.3-x86_64-bin-DVD1.iso vCenter [isostore] VMWare/VMware-VIMSetup-all-5.1.0-799735.iso BIND_NS [] /usr/lib/vmware/isoimages/linux.iso hvtest [isostore] Microsoft/OS/en_windows_server_2012_x64_dv... ALB-DC02 [isostore] Microsoft/OS/en_windows_server_2008_r2_sta... SL6 [] /usr/lib/vmware/isoimages/linux.iso win2k8r2tmpl win2k8_vuln [isostore] Microsoft/en_windows_server_2008_datacente...
Now we can unmount the images from all the machines:
C:\Users\Carlos> get-vm | Get-CDDrive | Set-CDDrive -NoMedia -Confirm:$false
Checking VMware Tools
I wrote a simple function to check if tools are running, outdated or just not installed. The function Get-VMToolStatus can get the status of the tools for a collection of VMs or all if none is specified. Here is an example for finding all the VM's whose tools need attention:
C:\Users\Carlos> Get-VMToolStatus | where {$_.ToolStatus -notin "toolsNotRunning","toolsNotRunning","toolsOK"} | ft -AutoSize Name ToolStatus ---- ---------- fedora toolsNotInstalled win2k3-vmtest toolsNotInstalled ESXi5.1-01 toolsNotInstalled Xenserver toolsNotInstalled Ubuntusrv toolsNotInstalled test2centos toolsNotInstalled vCenter toolsOld
Working with User Login, Permission and VM Console Events
Many times I find my self looking at login/Logoff actions and checking permissions for my customers to make sure nobody was given permissions they do not need or track the actions of a developer. Since this is a repeatable task I wrote a function that lets me filter events for sessions by the type of actions, The function is Get-VIUserEvents and one can filter for the following events:
- Privilege Management
- Login/Logoff
- Connection to VM Console
Many times I need to filter and look in specific time frames so the function supports filtering the search by:
- Hours
- Days
- Months
- Specific date in the past Also one can filter by user name.
To get a list of the event types we can look at the help information for the parameter:
C:\Users\Carlos> help Get-VIUserEvents -Parameter eventtype -EventType < string > Type of events to filter for. Accepts Permission, Session, Console or Any Required? false Position? named Default value Accept pipeline input? false Accept wildcard characters? false
Here is an example where we look for session events, in the last 8 hours and filter for the user administrator:
C:\Users\Carlos> Get-VIUserEvents -Hours 8 -EventType Session -UserName administrator IpAddress : fe80::6966:22f4:8dc0:b35b%10 UserAgent : VMware VI Client/4.0.0 Locale : en_US SessionId : 523ce38c-3fe5-d0d5-da47-8354f3a0c8ef Key : 103 ChainId : 103 CreatedTime : 4/12/2013 6:35:40 PM UserName : Administrator Datacenter : ComputeResource : Host : Vm : Ds : Net : Dvs : FullFormattedMessage : User Administrator@fe80::6966:22f4:8dc0:b35b%10 logged in as VMware VI Client/4.0.0 ChangeTag : DynamicType : DynamicProperty : IpAddress : 192.168.1.243 UserAgent : Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.18033) Locale : en SessionId : 52e52807-1476-783b-f480-d11d4551570c Key : 276 ChainId : 276 CreatedTime : 4/12/2013 6:41:52 PM UserName : Administrator Datacenter : ComputeResource : Host : Vm : Ds : Net : Dvs : FullFormattedMessage : User Administrator@192.168.1.243 logged in as Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.18033) ChangeTag : DynamicType : DynamicProperty : IpAddress : 192.168.1.243 UserAgent : Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.18033) Locale : en SessionId : 52dcfcc9-a945-631f-c993-0e72c9e8fd08 Key : 277 ChainId : 277 CreatedTime : 4/12/2013 6:41:53 PM UserName : Administrator Datacenter : ComputeResource : Host : Vm : Ds : Net : Dvs : FullFormattedMessage : User Administrator@192.168.1.243 logged in as Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.18033) ChangeTag : DynamicType : DynamicProperty :
Working with VM Power On, Power Off, Deletion, Creation and Console Events
Many times I found myself fishing thru events for monitoring actions taken on events that affected the availability of VM's and to monitor VM Sprawl so I crated in my toolkit Get-VMEvents to help me parse the events. Just like the user event function we can filter by event type and dates. We can see the event types we can filter thru can be seen in the parameter help:
C:\Users\Carlos> help Get-VMEvents -Parameter eventtype -EventType <string> Specific types of event to filter on. Accepts Creation, Deletion, Console, PowerOn, PowerOff or Any Required? false Position? named Default value Accept pipeline input? false Accept wildcard characters? false
Here is an example of checking for PowerOn events in the last couple of hours:
C:\Users\Carlos> Get-VMEvents -EventType PowerOn -Hours 3 Template : False Key : 373 ChainId : 373 CreatedTime : 4/12/2013 8:02:14 PM UserName : Datacenter : VMware.Vim.DatacenterEventArgument ComputeResource : VMware.Vim.ComputeResourceEventArgument Host : VMware.Vim.HostEventArgument Vm : VMware.Vim.VmEventArgument Ds : Net : Dvs : FullFormattedMessage : NessusScanner on labesxi01.darkoperator.com in Lab is powered on ChangeTag : DynamicType : DynamicProperty :