ESXi 5.5, Dell VRTX and Storage – or the lack there of!

8306.VRTX.jpg-1024x0Over the past couple of months I’ve been working on some vCO workflows to setup and configure a Dell VRTX as we are on the verge of deploying a handful of them.  Now this isn’t going to be a big post about what VRTX can do nor is it how to use vCO to set it up – I’ll save them for later – this is simply one small quirk that I’ve found when installing ESXi 5.5 onto the blades inside of the VRTX.

 

Small is the new big.

I shouldn’t have said small quirk – it’s somewhat of a show stopper.  If you simply throw on the vanilla ESXi 5.5 image, or even the Dell released image of ESXi 5.5 you will quickly notice that you have absolutely no storage available to you from the shared PERC controller that sits inside the VRTX.  Kind of hard to use the box with no storage :)

Before I go into my Dell rant if you are just looking for the solution, just scroll down to the “Driver thang” section of this post.  For the rest of us…

Start-Rant -Type ‘Mini’

ESXi 5.5 is not certified on a Dell VRTX, so ultimately, you could say, it isn’t supported – not by Dell or not by VMware.  What I don’t understand here is that how Dell can release a “converged” solution, promote the crap out of it stating how great it is to run VMware on, and not support the latest release of ESXi!?!?!  I mean, this thing was released in the summer of 2014.  ESXi 5.5 was announced at VMworld in August 2013!  You would think that Dell would have the drive to hit the market with this thing supporting the latest and greatest software – but no – either way, I’m sure it will all be updated soon, and I’m sure they have their reasons – but for the meantime, here’s how to get it going…

Stop-Rant

Ain’t nuttin but a driver thang.

The fact that you don’t see storage isn’t the result of any major issue or complex problem.  It’s simply a driver.  The driver that the shared PERC uses included with the ESXi 5.5 image is just too new (?!?!?!).   However the version you need, or the version that I’ve found to work is labelled megaraid_sas version 06.801.52.00.  What the difference is between these two versions I have no idea, i just know you need 6.801.52 to make it work.  You can grab that here.

Once you have the file you are just a vib install away from VRTXing all night long.  Pick your poison when it comes to vib installs; update manager, vMA or esxcli – for the sake of not having to put too much effort into anything I’ll go over the esxcli way of installing the vib.  First things, upload that VIB to one of your datastores or an accessible area on the host.  From there, ssh in and install the vib using the following command.

esxcli software vib install -d /tmp/megaraid/megaraid_sas-06.801.52.00-offline_bundle.zip

The only thing that stands in between you and your VRTX storage now is a reboot, so go ahead and do that.

There you have it – storage!

This is only the way I’ve found to make storage work with the VRTX and 5.5 and hey, I could be crazy by doing all of this – so if you have any other suggestions, concerns, or comments I encourage them below or send me a message on Twitter – Like I said, I have a handful of these to configure so I’d rather not roll them out in some kind of crazy state :)

Asus Nexus 7 Giveaway courtesy of vSphere-land and Veeam

Nexus-7-2013

Say what!?!?!  You are giving a way an Asus Nexus 7 tablet?!?  Why yes, yes I am!  Aside from landing myself #20 on the Top Virtualization blogs at vSphere-land.com I also won myself a pretty sweet Nexus 7 tablet as well as one to giveaway to one of you fine folk.

You can thank the great people over at Veeam once again for this giveaway!  They sponsored this years blog voting with some awesome prizes including Sony headphones, Chromecasts, Pebble watches, Jockery Batteries and the Nexus 7 tablets.  Also, don't forget to reach out to Eric Siebert and thank him as well!  I know he puts countless hours into the blog voting – so let him know how much you appreciate it!

What is an Asus Nexus 7?

In its essence it's a 7 inch android tablet.  The real benefit though comes in the name Nexus, simply meaning you are getting a stock version of the Android OS – meaning they are free from all the bloatware or manufacture modifications and you will receive your software updates directly from Google, without reliance on the manufacturer.

As far as specifications go I'll let you check them out for yourself – but from what I've read the ASUS Nexus 7 really hits it home when it comes to design, display, and performance – so what more can you really ask for?

How to enter?

I didn’t feel like making this one too complicated – just leave a comment on this post.  What to comment on?!?!  It’s up to you really – talk about the significance of the number 20, tell the world something they don’t know about you, tell me how great the Habs are and how they are going to take home Lord Stanley, throw in a #ScottLoweFact, simply just bang away on your keyboard – your choice really!  Feel free to go ahead an use a fake email if you wish, but if I can't get a hold of you I'll just draw another name.  I’ll tally up the comments and have a random number generator give me the winner!  This contest will close at 11:59 PM EST on Thursday, April 24th so the clock is ticking!  Good luck!

Quick To The Point – No port options on vCO ssh plug-in.

Do you run ssh on its standard and default port?  I for one, do not. That's why I was surprised when I found that the built in workflows for the ssh plugin in vCO have no input parameter for port and simply ride along the standard ssh port of 22

Thankfully for those of us that modify our sshd_config the underlying methods and constructs of the ssh plugin allow for us to specify a port, it's just the workflows built around them don't reflect that. So lets go through an example of modifying the "Run SSH Command" workflow to accept a port.

First up, duplicate the workflow. You don't want to modify the original as you have no idea what might be using it.

Next, we need to add an input parameter (type string) called, you guessed it. – port.

ttp-ssh-1

On the Presentation tab let's drag our port parameter up to the Host selection display group so things look nice and pretty

ttp-ssh-2

Now let’s edit the first scriptable task in the schema (Execute SSH Command).  We will need to ensure that we have access to our port parameter by mapping it in our ‘In’ tab.

ttp-ssh-3

And on the Scripting tab of that same element, we can see our session gets established on Line 2.  Here we can simply change the options we send to that construct from “var session = new SSHSession(hostName,username);” to “var session = new SSHSession(hostName,username,port);”

Save and close your workflow. Go ahead and test it now. You should now be executing your ssh commands on whichever port you have specified.  Now you can go ahead and add a port parameter to any workflow that references new SSHSession();

VMworld is just around the corner – Call for papers is open!

CaptureFunny how time sneaks up on you sometimes.  Just as my feet are in the final stages of healing up from VMworld 2013 I realize that VWworld 2014 is only 5 months away!  Here's hoping I can make it out again this year.  

On the fence about attending, looking for finances or approvals – How's about presenting?!?! – For starters, it gets you a ticket to the conference, so you can take that off your list.  Also, I think it gets you a night of hotel expenses.  Most of all, it gets you the chance to stand up in front of your peers and share what you know in hopes of making everyones job easier.

So how do you go about presenting – well, luckily for you the "Call For Papers" has just opened up today!  Head over to VMworld.com and put together a small abstract outlining what you would like to talk about!  Be sure to make it appealing too.  Don't just throw it out there like this blog post – these will be judged and voted on and only the best ones will be accepted.  I for one have presented during a couple of panel discussions at VMworld, but never all by my lonesome.  Maybe this year will be that year!

Hope to see you there!

Migrating workflows from one vCO server to another!

Although vCenter Orchestrator does offer an upgrade path for their appliances there are times where I have found myself needing to deploy a new one and migrate all of my configuration and workflows to it.  vCO has some great built in workflows that can configure itself, but nothing that really deals with workflows.  Sure, you can export and import workflows one at time using the client, which may be ok if you have 10 workflows, but what if you have 20, 40, 100 that you need to migrate.  That could get pretty monotonous.

The shear energy of a mouse click.

That’s right – who wants to exert all that energy of clicking on the mouse to get these workflows migrated when we can just orchestrate or automate it – after all, this is vCenter Orchestrator we are talking about.  vCO has a REST plugin that allows us to create workflows around any application that offers one, but did you know that vCO also has it’s own REST API available for us to use?  So that’s where I started with my task of migrating workflows and by the time I got to writing this post it truly ended up being a community effort.

“Steal from the best”

This was a quote that I seen on one of Alan Renouf’s slides during a VMworld presentation on PowerCLI.  “Steal from the best”, “Don’t re-invent the wheel” – sayings that have resonated with me for my entire career – Why re-do something if it has already been done.  So when I set out on this small project I ended up using two main sources; This post by William Lam on VirtuallyGhetto on how to use curl to export a single vCO workflow and this forum reply by igaydajiev who “showed me the light” on how to import a workflow back in!  Without these two guys I wouldn’t have been able to do any of this.

Enough already let’s get to it!

So I chose to go the PowerShell route to accomplish this as I’m not too familiar with the REST plugin for vCO.  As well, I am targeting only a certain category – so basically what the script does is take in the following parameters

  • OldvCOServer – the old vCO appliance
  • OldvCOUser/OldvCOPass – credentials for the old appliance
  • OldvCOCategory – Category Name to export workflows from
  • TempFolder – Location to store the exported workflows
  • NewvCOServer – The new vCO appliance
  • NewvCOUser/NewvCOPass – credentials for the new appliance
  • NewvCOCategory – Category name on new server where you would like the worfkflows imported.

As far as an explanation I’ll just let you follow the code and figure it out.  It’s basically broke into two different sections; the export and the import.  During the import routine there is a little bit of crazy wonky code that gets the ID of the targeted category.  This is the only way I could figure out how to get it and I’m sure there is a way more efficient way of doing so, but for now, this will have to do.  Anyways, the script is shown below and is downloadable here.  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
Param(
  [string]$oldvCOServer="localhost",
  [string]$oldvCOUser="vcoadmin",
  [string]$oldvCOPass="vcoadmin",
  [string]$oldvCOCategory="MyOldWorkflows",
  [string]$newvCOServer="localhost",
  [string]$newvCOUser="vcoadmin",
  [string]$newvCOPass="vcoadmin",
  [string]$newvCOCategory="MyWorkflows",
  [string]$TempFolder
)
 
# vCO Port
$vcoPort="8281"
 
# Type to handle self-signed certificates
add-type @"
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    public class TrustAllCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(
            ServicePoint srvPoint, X509Certificate certificate,
            WebRequest request, int certificateProblem) {
            return true;
        }
    }
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
[byte[]]$CRLF = 13, 10
 
function Get-AsciiBytes([String] $str) {
    return [System.Text.Encoding]::ASCII.GetBytes($str)            
}
 
function ConvertTo-Base64($string) {
   $bytes  = [System.Text.Encoding]::UTF8.GetBytes($string);
   $encoded = [System.Convert]::ToBase64String($bytes); 
 
   return $encoded;
}
 
clear
##############  EXPORT OLD WORKFLOWS ##############################
Write-Host "Beginning Export Routine" -ForegroundColor Black -BackgroundColor Yellow
Write-Host ""
# build uri
$uri = "https://"+$oldvCOServer+":"+$vCOPort+"/vco/api/workflows/?conditions=categoryName="+$oldvCOCategory
 
# Authentication token or old server
$token = ConvertTo-Base64("$($oldvCOUser):$($oldvCOPass)");
$auth = "Basic $($token)";
$header = @{"Authorization"= $auth; };   
 
#execute API call
$workflows = Invoke-RestMethod -URi $uri -Method Get -ContentType "application/xml" -Headers $header
Write-Host "Exporting $($workflows.total) workflows from $oldvCOCategory"
Write-Host "-------------------------------------------------------------------------------------------"
#loop through each workflow and export to TempFolder
foreach ($href in $workflows.link.href)
{
    #retrieve information about the specific workflow
    $header = @{"Authorization"= $auth; };   
    $workflow = Invoke-RestMethod -URi $href -Method Get -ContentType "application/xml" -Headers $header
 
    #replace all spaces in workflow name
    $workflowname = [System.Text.RegularExpressions.Regex]::Replace($($workflow.name),"[^1-9a-zA-Z_]","")
    $filename = $TempFolder + $workflowname + ".workflow"
    # setup new header
    $header = @{"Authorization"= $auth;
                "Accept"="application/zip"; }; 
    Write-Host "Exporting $($workflow.name) to $filename - " -NoNewline
    Invoke-RestMethod -URi $href -Method Get -ContentType "application/xml" -Headers $header -OutFile $filename
    Write-Host "Done" -ForegroundColor Green  
}
Write-Host ""
Write-Host "Export Routine Complete" -ForegroundColor Black -BackgroundColor Yellow
##################################################################
 
##############  IMPORT WORKFLOWS ##############################
Write-Host ""
Write-Host ""
Write-Host "Import Routines to new server" -ForegroundColor Black -BackgroundColor Yellow
Write-Host ""
 
#Generate auth for new vCO Server
$token = ConvertTo-Base64("$($newvCOUser):$($newVCOPass)");
$auth = "Basic $($token)";
 
#Get Category ID
$header = @{"Authorization"= $auth; };   
$uri = "https://"+$newvCOServer+":"+$vCOPort+"/vco/api/categories/"
$categories = Invoke-RestMethod -URi $uri -Method Get -Headers $header -ContentType "application/xml" 
foreach ($att in $categories.link)
{
    if ($att.attributes.value -eq "HPEDSB")
    {
        foreach ($newatt in $att.attributes )
        {
            if ($newatt.name -eq "id")
            {
                $categoryID = $newatt.value
            }
        }
    }
}
 
$impUrl = "https://$($newvCOServer):$($vcoPort)/vco/api/workflows?categoryId=$($categoryId)&overwrite=true";
$header = @{"Authorization"= $auth;
            "Accept"= "application/zip";
            "Accept-Encoding"= "gzip,deflate,sdch";};    
 
$workflows = Get-ChildItem $TempFolder -Filter *.workflow
Write-Host "Importing $($workflows.count) workflows to $newvCOCategory"
Write-Host "-------------------------------------------------------------------------------------------"
foreach ($workflow in $workflows)
{
    Write-Host "Importing $($workflow.name) - " -NoNewline
    $body = New-Object System.IO.MemoryStream
    $boundary = [Guid]::NewGuid().ToString().Replace('-','')
    $ContentType = 'multipart/form-data; boundary=' + $boundary
    $b2 = Get-AsciiBytes ('--' + $boundary)
    $body.Write($b2, 0, $b2.Length)
    $body.Write($CRLF, 0, $CRLF.Length)           
    $b = (Get-AsciiBytes ('Content-Disposition: form-data; name="categoryId"'))
    $body.Write($b, 0, $b.Length)
    $body.Write($CRLF, 0, $CRLF.Length)
    $body.Write($CRLF, 0, $CRLF.Length)
    $b = (Get-AsciiBytes $categoryId)
    $body.Write($b, 0, $b.Length)
    $body.Write($CRLF, 0, $CRLF.Length)
    $body.Write($b2, 0, $b2.Length)
    $body.Write($CRLF, 0, $CRLF.Length)     
    $b = (Get-AsciiBytes ('Content-Disposition: form-data; name="file"; filename="$($workflow.Name)";'))
    $body.Write($b, 0, $b.Length)
    $body.Write($CRLF, 0, $CRLF.Length)            
    $b = (Get-AsciiBytes 'Content-Type:application/octet-stream')
    $body.Write($b, 0, $b.Length)
    $body.Write($CRLF, 0, $CRLF.Length)
    $body.Write($CRLF, 0, $CRLF.Length)
    $b = [System.IO.File]::ReadAllBytes($workflow.FullName)
    $body.Write($b, 0, $b.Length)
    $body.Write($CRLF, 0, $CRLF.Length)
    $body.Write($b2, 0, $b2.Length)
    $b = (Get-AsciiBytes '--');
    $body.Write($b, 0, $b.Length);
    $body.Write($CRLF, 0, $CRLF.Length);
 
    $header = @{"Authorization"= $auth;
            "Accept"= "application/zip";
            "Accept-Encoding"= "gzip,deflate,sdch";};    
    Invoke-RestMethod -Method POST -Uri $impUrl -ContentType $ContentType -Body $body.ToArray() -Headers $header
    Write-Host "Done" -foregroundcolor Green
}
 
Write-Host ""
Write-Host "Import Routine complete" -ForegroundColor Black -BackgroundColor Yellow
##################################################################

vExpert – Third times a charm!

I'm happy to announce that I have once again been awarded the vExpert status for the year 2014.  Being a vExpert is important to me, not for the licenses or perks that come with the title, but for the networking and learning opportunities that arise throughout the year.

Every year at VMworld John Troyer (@jtroyer) and Cory Romero (@vCommunityGuy) put together a vExpert/VCDX reception.  Just think about cramming a couple hundred vExperts/VCDX's into a room with free beer for a couple of hours – certainly any virtualization issue you have can be easily resolved within those 4 walls.   If I weren't a vExpert I most likely, well, I know for sure I wouldn't have received invites to the last two CTO parties in which I've had the opportunity to meet and speak with a couple of lesser known guys like ohhh Stephen Herrod and Pat Gelsinger :)  Need proof?  Here's your Toronto VMUG leadership team with our best buddy Pat.

to-vmug-gelsinger

The best part about being a vExpert which really doesn't directly relate to being a vExpert at all ( I know, that makes no sense, just bare with me) is how it has opened up the doors for some lifelong friendships.  While going through the motions of what it takes to be a vExpert; engaging with the community, sharing knowledge, presenting and evangelizing I have met a lot of people who truly inspire me and I'm lucky to be able to call a friend.  I've had the chance to form a great friendship with guys like Jason Langer and participate within the #vDB (These are some of the greatest guys I know), and also follow the lead of fellow Canadian vExperts like Angelo Luciani and Eric Wright.  Speaking of those last two names – if anyone does community right it's got to be Angelo and Eric.  The dedication these guys have to the community is amazing – Eric, a dedicated blogger with a great insight on IT, always willing to stand up and share what he is thinking. And Angelo, who you can see the excitement in his eyes just to be amongst the community in the hang space at VMworld, truly cares about the community and brining people together. These are definitely two of the biggest supporters I have had over the years.  These friendships extend far beyond the VMware community and I hope will exist long after 'the next big thing' comes and disrupts the datacenter!

Anyways, I'm starting to get off topic now and I'm also beginning to sound like a 13 year old girl, so I'll stop name dropping now!  Congrats to all the new and returning vExperts and thanks to everyone for their support over the years.  A huge animal style thanks to John and Corey for organizing and 'herding the cats' again this year.  And the biggest thanks goes out to you, the community, for all the feedback and encouragement you have given me over the last year.   I'm thrilled to once again be named a vExpert!