Category Archives: VDI

Home Lab

Well it has been a long time since I have posted anything here! We have been pretty busy with life and work! The reason I am writing is because I wanted to share a little about my home lab setup. Although I use this lab for work(Solution Architect at Unidesk), this is my equipment and my baby 100%. For work I use this lab to demonstrate to customers and prospects how Unidesk is able to deliver layered images to the provisioning mechanism like VMware View Composer, Citrix MCS, Citrix PVS. I also use it for personal geeky things! For example I have a Ubuntu VM that is my syslog server for the Fortigate 50E. It is not super pretty, but it does the job and I love palying around in my lab.

My Home Lab:

Switch: ZyXel GS1900-16
Firewal/Router: FortiGate 50E

1. Dell PowerEdge R710, Xeon X5660 @ 2.8GHz, 128GB Memory, 5TB local storage(1TB is SSD)
2. Dell PowerEdge R710, Xeon X5670 @ 2.93GHz, 144GB Memory, 12TB local storage

Shared Storage: Synology DS416 2.5TB(1TB is SSD) of storage

Hypervisor: ESXi 6
Nested Hypervisors: Hyper-V, Xenserver, AHV Community Edition

Technologies Deployed in Lab:
VMware vCenter
Horizon View & Composer
Citrix XenApp, XenDesktop, MCS, PVS
Unidesk 2x, 3x, 4x

PowerShell & PowerCLI

I have put off learning Windows PowerShell for too long. Which is really surprising, as I have done a lot of Perl and PHP in the past.

While I was a Student Linux Admin at Clark Community College (2001) I had written a Perl script for user account management on Computer Science Department RedHat box. The script took a CSV file with student ID’s and qualifying/disqualifying classes and created, disabled, and in some cases removed the account. If the account was going to be removed I would check the MySQL backend and if the user had an account that was disabled for 2 quarters then the account and user directory was removed at the start of the 3rd quarter.

I have done several Perl and PHP scripts, but one PHP script stands out.  We had put in a new ProxCard system to control our doors and gate and the software wasn’t usable for our non-technical staff.  I had to figure out where the ProxCard system was inserting records into the SQL database and once I figured that out I whipped up a couple of Perl scripts to test. Eventually this grew into a regular LAMP server with users accounts and auditing.

Yeah I really just wrote my second PowerShell/PowerCLI script a few days ago!

So my first script I wrote checked my vSphere cluster for VMs with multiple vCPUs (and no I didn’t do a “Hello World!”)

#Find all virtual destkops running on a cluster that have more than one vcpu

# Launch text
write-host "                                                                                  "
write-host "         Rob's First Script to check a cluster for VMs running more than one vcpu!" 
write-host "                                                                                  "

$cluster = Read-Host 'On Which cluster to you want to check for multiple vcpus?'

get-cluster $cluster | get-vm | select name,powerstate,numcpu,memorygb,host |where {$_.numcpu -gt 1 -and $_.powerstate -eq "PoweredOn"} |format-table -autosize

get-cluster $cluster | get-vm | select name,powerstate,numcpu,memorygb,host |where {$_.numcpu -gt 1 -and $_.powerstate -eq "PoweredOn"} |group-object -Property Host | Select Count, Name | format-table -autosize

I wrote my second script recently to find folders on a specific datastore. This datastore is used for a backup/archive snapshot for VDI using Unidesk. Currently when I remove a machine in Unidesk or restore to a different cachepoint we can end up getting orphaned files on the archive datastore.

#get-cluster cluster02
$cluster = "cluster02"

function CheckVM {
$VM = get-cluster $cluster | Get-VM -name $vmname -ErrorAction SilentlyContinue
        $status = "No VM"
   else { 
        $status = "VM Found" 

return $status

#grab folders on archive tier datastore VDIBU

$cp1ap=  "vmstores:\vc01@443\DataCenter\VDIBU\Unidesk Backups\VDI01\User"
$cp2ap=  "vmstores:\vc01@443\DataCenter\VDIBU\Unidesk Backups\VDI02\User"

#exclude any . files if any and make sure it's a folder and not a file
$cp1Folders =
get-childitem -exclude .* $cp1ap | select name,PSIsContainer | where {$_.PSIsContainer -eq "True"} |foreach {$}

#exclude any . files if any and make sure it's a folder and not a file
$cp2Folders =
get-childitem -exclude .* $cp2ap | select name,PSIsContainer | where {$_.PSIsContainer -eq "True"} |foreach {$}

#combine arrays and print out hash to see if a MM has been restored to another CP at some point in time
$AFolders = $cp1Folders + $cp2Folders

$AFolders | group | % {$hash = @{} } { $hash[$_.Name] = $_.Count }

foreach ($key in $hash.GetEnumerator()){
    $vmExists = CheckVM $($key.Name)
    Write-Host "$($key.Name)    has $($key.Value) archive folders and: $vmExists" 

I know it is ugly but it works 🙂