tag:blogger.com,1999:blog-42653532989393476522024-03-06T05:46:03.811+11:00Wheat on the WireThoughts of a virtualisation specialist and solutions architect.Nathan Wheathttp://www.blogger.com/profile/16568216079224543463noreply@blogger.comBlogger13125tag:blogger.com,1999:blog-4265353298939347652.post-55198425871735300042015-09-01T18:10:00.000+10:002015-09-01T18:10:33.833+10:00Automatic Shutdown of Idle Machines with vRealize Operations and vRealize Automation<i><span style="font-size: x-small;">(Credit to my colleagues for this work: James Polizzi, Scott Stickells)</span></i><br />
<br />
We were engaged at a customer recently who had an issue with over-consumption of their development platform. This is probably familiar to lots of us, and the customer was interested in how vRealize Suite could help solve that.<br />
<br />
As we know, vRealize Automation helps to attach ownership to resources, identify an appropriate lease time for non-permanent machines, and help with the entire lifecycle of virtual machines. vRealize Operations helps even further by identifying inefficiencies in the environment – in particular, those virtual machines that are chewing up resources inappropriately, whether over-sized, idle and unused, or perhaps just hogging storage.<br />
<br />
In our customer’s situation, they not only wanted to control the lifecycle of virtual machines, but also ensure that ONLY needed virtual machines were running on the platform. That meant figuring out which virtual machines were idle and unused, and shutting them down immediately – all without human intervention, review or overhead. To help address this, we looked at two main elements of extending the vRealize Suite:<br />
<br />
<ol>
<li>A policy in vRealize Operations that could be associated with the development environment, identify idle machines (with the appropriate policy to define what “idle” meant), and AUTOMATICALLY take an action to call vRealize Orchestrator and shutdown the idle machines. </li>
<li>A workflow in vRealize Orchestrator that would take the parameters from vRealize Operations, find the machines under vRealize Automation, invoke the clean and controlled “Shutdown” action, and notify the associated machine owner of the action that had been taken.</li>
</ol>
<br />
<br />
<h3>
vRealize Operations</h3>
(Just as a foreword, one of the key features that is soon to be released in vRealize Operations 6.1 is the ability to fully automate “Smart Alerts” without ANY user intervention. So for the purpose of this blog, keep in mind that we are using the vRealize Operations 6.1 BETA release)<br />
<br />
To achieve the required outcomes there were a few elements that we configured in vRealize Operations. <br />
<br />
Firstly, we installed a customised version of the vRealize Orchestrator adapter available <a href="https://solutionexchange.vmware.com/store/products/vro-solution-and-workflow-package-for-vrealize-operations-manager" target="_blank">here</a>. When I say customised, what we did was add an additional vRealize Operations action called “VM: Auto Power” that references the vRealize Orchestrator workflow we created (detailed below). In theory, this could reference any workflow you require. While we will see this process simplified in future releases, today it requires assistance from VMware Professional Services – or some detailed know-how of Solution Pack design!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvX98DueD2ZE9CRq3rVzf3_AtrdDM_KFVYMkpu5Jg7yeAOL4Fl1_oB1tMfax5UWpWnRqDV82QdmiZHkz8wZSW_OUFikc9K7eqs92hXnKDf0jTNA7kND0yA2Nd5c_YQMqLJ4TVm9H4j4qy1/s1600/Adapter.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="51" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvX98DueD2ZE9CRq3rVzf3_AtrdDM_KFVYMkpu5Jg7yeAOL4Fl1_oB1tMfax5UWpWnRqDV82QdmiZHkz8wZSW_OUFikc9K7eqs92hXnKDf0jTNA7kND0yA2Nd5c_YQMqLJ4TVm9H4j4qy1/s640/Adapter.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnQPPStsOLgmsFa0Zo190XA32yrI0OoFiLlzBWhQwZBrSde28jQTg1pZU4uMAPzysrpTbIDUMlMhqBozQh3rNPBhOLp-in0I60VuKfT0xHw67ZiywrbhTN_K7POHxZ5ldTs0NbMgxbeBYh/s1600/Solutions.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="108" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnQPPStsOLgmsFa0Zo190XA32yrI0OoFiLlzBWhQwZBrSde28jQTg1pZU4uMAPzysrpTbIDUMlMhqBozQh3rNPBhOLp-in0I60VuKfT0xHw67ZiywrbhTN_K7POHxZ5ldTs0NbMgxbeBYh/s640/Solutions.png" width="640" /></a></div>
<br />
<br />
Secondly, we created a “Custom policy” which we will assign to a Custom group of objects. This allows us to selectively enforce our automated alert and define exactly what we consider to be an “Idle VM”. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv5O38Aw_WhX2XUc3yaWCMOKdim2AnPfJ5-VRb_8sfij9mcP7XxDGxl-xmcWGdgvTOluCHKOO6dIGa_f7JLCR9SCX22anvBN7fvsE6IAzaauS55GU1Bi3yEMQR0fZSu5YXif10W3gEQwKr/s1600/Custom+policy.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="312" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv5O38Aw_WhX2XUc3yaWCMOKdim2AnPfJ5-VRb_8sfij9mcP7XxDGxl-xmcWGdgvTOluCHKOO6dIGa_f7JLCR9SCX22anvBN7fvsE6IAzaauS55GU1Bi3yEMQR0fZSu5YXif10W3gEQwKr/s640/Custom+policy.png" width="640" /></a></div>
<br />
<br />
Next we created a “Custom group” of objects (VMs) that we wanted to target with this automated remediation action. We have the ability to filter on a number of different aspects. One of the more popular ways is to create a dynamic group using a vSphere tag, or perhaps using folder structures in vCenter. In our case, for simplistic testing, we statically assigned particular workloads to this group using “Objects to always include”. After this group is created, it needs to be referenced in the custom policy specified above. Take care with the order in which you perform these actions, to ensure you don’t accidentally start to automatically shutdown idle machines across all vRA-managed workloads!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfsozcgvNL2pnMDKY_KSDv6hNwtScDqekGcd_W4fTvMmqCEJikyZGxNA4mMK6y8mBRtln0JRZJyX9tx77tv-ziZuKSkmyzQ3OJFQe6M1jceAUbmYKW_tM4T6t3AUkhEK5dfmLzmNUhSL1O/s1600/Groups.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="336" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfsozcgvNL2pnMDKY_KSDv6hNwtScDqekGcd_W4fTvMmqCEJikyZGxNA4mMK6y8mBRtln0JRZJyX9tx77tv-ziZuKSkmyzQ3OJFQe6M1jceAUbmYKW_tM4T6t3AUkhEK5dfmLzmNUhSL1O/s640/Groups.png" width="640" /></a></div>
<br />
<br />
<br />
After this we configured a new “Smart Alert” with the condition “VM is Idle = 1” and add the action “VM: Auto Power”, to trigger our Orchestrator workflow when the workflows are detected as being idle.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj12eQZF0wjId6braAD3FEyXIwuzq1O36W6tiliTGRIdTrKsbV3mS1YKAEfmzB6F1Nb3BQ6zjX3qeRu4APkuz0klbrWmnqNZSqUcscA3iOvSc6d4j32h8ptnb-YMmdjBX-ZkFjyvMmus2g9/s1600/Alert.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj12eQZF0wjId6braAD3FEyXIwuzq1O36W6tiliTGRIdTrKsbV3mS1YKAEfmzB6F1Nb3BQ6zjX3qeRu4APkuz0klbrWmnqNZSqUcscA3iOvSc6d4j32h8ptnb-YMmdjBX-ZkFjyvMmus2g9/s640/Alert.png" width="640" /></a></div>
<br />
<br />
Finally, we activated the alert - by “editing” our recently created policy, finding the alert in question (in section 5. Override Alert/Symptoms Definitions) and selecting “enable” for both “state” and “automate”. In other words, we enable this alert locally in the policy and enable the automate action when the given conditions are true!<br />
<br />
Note: the “Automate” option is disabled on all alerts by default - which is definitely a good thing considering the power of this functionality!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWm2n0gVRvAKaF2nI9wTRSXDR3lBTrd4-rHQC_BFopLF2IIodxWS8T0D8E6nr98WjZjLibIwmuYEbAlIllSFCYIzPPIWnczrxxrSpY-JcKMtvnpStWSGw9SrvK6Qz7uOFX2nFqL_-7YPb1/s1600/Policy.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="332" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWm2n0gVRvAKaF2nI9wTRSXDR3lBTrd4-rHQC_BFopLF2IIodxWS8T0D8E6nr98WjZjLibIwmuYEbAlIllSFCYIzPPIWnczrxxrSpY-JcKMtvnpStWSGw9SrvK6Qz7uOFX2nFqL_-7YPb1/s640/Policy.png" width="640" /></a></div>
<br />
<br />
Once this is all complete, you will see that when any workload, that is a member of the given group/policy that “is idle”, we will automatically initiate the Shutdown workflow and send an email notification to the owner of the workload!<br />
<br />
<br />
<h3>
vRealize Orchestrator</h3>
In this workflow, which you can download <a href="https://communities.vmware.com/docs/DOC-30159" target="_blank">here</a>, we still need to manually configure a few items first. This is done by invoking the “Configuration” workflow first, which makes it a little easier to draw out the static environment inputs needed by the workflow such as your email server, port, etc.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyzCGfgeyzQnVLYHvYkZhieHyO67pjrpIewA1ujzT9DWwlk34mDW6kziLG9-B4zgmxV64t3iu2xUp54eCcSFOqEI1R3JLyMZpQqjXu809TUEMlRCP6mmMqL5_iE6HgRex6LDvztBWEa6l4/s1600/Workflow+library.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="121" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyzCGfgeyzQnVLYHvYkZhieHyO67pjrpIewA1ujzT9DWwlk34mDW6kziLG9-B4zgmxV64t3iu2xUp54eCcSFOqEI1R3JLyMZpQqjXu809TUEMlRCP6mmMqL5_iE6HgRex6LDvztBWEa6l4/s320/Workflow+library.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn1IgOYsSjM3yFPbCrLfGHsOOJNodDndRN3dOjvNhWzuyBVLfPCgH5POUsMLmStpG0ncLPXdAhz5ggTUBOicpQfJqIjl5RvdtH71pndBRSOgwzvCc-dhlIq1Vwx7qH4pJ4R83tcGIiCg3_/s1600/Configuration+Element.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn1IgOYsSjM3yFPbCrLfGHsOOJNodDndRN3dOjvNhWzuyBVLfPCgH5POUsMLmStpG0ncLPXdAhz5ggTUBOicpQfJqIjl5RvdtH71pndBRSOgwzvCc-dhlIq1Vwx7qH4pJ4R83tcGIiCg3_/s640/Configuration+Element.png" width="640" /></a></div>
<br />
<br />
The workflow is invoked by vRealize Operations with a virtual machine identifier, an event correlation identifier (for logs and auditing), and the unique ID for the vCenter Server (in case your vRealize Operations is monitoring multiple vCenters). Virtual machines have quite a few different types of identifiers – in this case, vRealize Operations is passing the Managed Object ID which is of the type “vm-9110”. This identifier is not guaranteed to be unique, especially across multiple vCenters. More importantly, it isn’t the one tracked by vRealize Automation. The workflow, therefore, needs to use the given identifier to find the “instanceUUID” of the VM from vCenter, which is also a key attribute (“vmUniqueId”) in vRealize Automation.<br />
<br />
Next, the workflow extracts the matching VM object from vRealize Automation, and also the email address of the object’s owner. It uses this later to send an email notification to the owner of the idle machine’s shutdown, with the in-built mail workflows. In vRealize Automation, the Shutdown action is not something that can be called by name, but rather has its own UUID which has to be found. In the workflow, we enumerate all the available actions for the identified virtual machine, and find the one named “Shutdown”. There is a chance that this action won’t be found – most especially if the virtual machine is already off! This could also be a possibility if the virtual machine is in the middle of some other state (being reconfigured), or if the Shutdown action isn’t exposed by the blueprint owner. <br />
<br />
As you can see by the below screenshots, this workflow has a relatively small number of steps (if you ignore the helpful logging parts!), and just works as designed. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1nofnSF0cR3-WTHAaQPHh1D_jxDSwIl0w5Uhm0tHnyza3rlkM5TGohLD81KjxTma5q08M-kpGK2t1ug0RjMe12wCeClzStJXo2O3TZdRV20Ai5QmW_kTsUgFPoYaYRHBIOnL9ScA6pChC/s1600/Workflow+diagram.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="268" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1nofnSF0cR3-WTHAaQPHh1D_jxDSwIl0w5Uhm0tHnyza3rlkM5TGohLD81KjxTma5q08M-kpGK2t1ug0RjMe12wCeClzStJXo2O3TZdRV20Ai5QmW_kTsUgFPoYaYRHBIOnL9ScA6pChC/s640/Workflow+diagram.png" width="640" /></a></div>
<br />
<br />
In the email notifications, we found a way to reconstruct the URL directly to the virtual machine in vRealize Automation, and hence help the VM owner to quickly go and power their machine straight up again if needed. This leads me onto the conclusions for this article…<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvy2J9o9EizKAcwbn9iYP3kATTGXjbMo-UKK_ShUP0-qNMh-7sCpiCtYgsb8oxoSR9X5J8VST5MJRN3WRxG3d7BoZQTBtSANYCl5GXZsfiYqbVRIJ16BDxnqESFcPwIy4JPhaozBDZiJsu/s1600/Email+notification.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvy2J9o9EizKAcwbn9iYP3kATTGXjbMo-UKK_ShUP0-qNMh-7sCpiCtYgsb8oxoSR9X5J8VST5MJRN3WRxG3d7BoZQTBtSANYCl5GXZsfiYqbVRIJ16BDxnqESFcPwIy4JPhaozBDZiJsu/s640/Email+notification.png" width="640" /></a></div>
<br />
<br />
<br />
<h3>
Conclusions</h3>
While this workflow does exactly what was desired – shutting down idle virtual machines – it doesn’t have the whole picture covered yet. From a technical perspective, should the workflow look to “Power off” the machine if Shutdown doesn’t work? How should it handle multi-machine blueprints (we didn’t test those)?<br />
<br />
A really helpful consequence of invoking the Shutdown action through the vRealize Automation layer is that any existing Approval steps or further custom extensions will still be invoked, just as if the user had tried to manually shutdown their virtual machine. This opens up the potential for the system to be controlled and reviewed through a business process, using the standard vRealize Automation features. <br />
<br />
This opens up a line of questions around whether ANY machines should be subject to automatic shutdown without human intervention and review. The answer for some environments will be an emphatic “NO”, because the impacts won’t be well understood straight away. Other environments already do this, however, because the private/public cloud use cases are build within a certain operational culture from the outset. So, before you take this work and throw it into your own environment, ask some questions about what virtual machine populations this would be suitable for, what would happen if idle machines magically became unavailable, and whether this is really addressing your core problems. You might find confirmations that this is indeed the right way to go, but you might also find that the basic features of vRealize Automation allows enough accountability, lease control and cost visibility to address most of the wastage inside your infrastructure.<br />
<br />
Happy automating!<br />
<br />
<br />
<br />Nathan Wheathttp://www.blogger.com/profile/16568216079224543463noreply@blogger.com0tag:blogger.com,1999:blog-4265353298939347652.post-83355843185686473162015-07-09T14:45:00.000+10:002015-07-09T14:51:02.427+10:00Searching within vRealize Automation – Part 2 – REST API In <a href="http://wheatcloud.blogspot.com.au/2015/07/searching-within-vrealize-automation.html">Part 1</a> of this article series, I wrote about using some of the more interesting queries possible through the vRealize Automation IaaS component. Specifically, using the Model Manager calls from vRealize Orchestrator. Here in Part 2, I will demonstrate yet another approach to searching – but this time from the new vRA REST API.<br />
<br />
<h3>
Getting into the API session</h3>
There are already a number of articles about getting into the REST API. But in short, I used the Firefox plug-in “REST Client”. See the screenshot below for the example of how to initiate the authenticated session in the REST Client. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWTCMyfvxJwxdngQTchAyCDmhG4bzu3NLHL-ic4O6NfPSu8azCHmtFUCBoe7hOUNGzoQQSGUA6RfBgvmZhRIprrM1IWCofFd85VGGusBDNieOQvrQTd0VHW-71NhKHn62GPkr0rm7c7TtH/s1600/Authenticate.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="385" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWTCMyfvxJwxdngQTchAyCDmhG4bzu3NLHL-ic4O6NfPSu8azCHmtFUCBoe7hOUNGzoQQSGUA6RfBgvmZhRIprrM1IWCofFd85VGGusBDNieOQvrQTd0VHW-71NhKHn62GPkr0rm7c7TtH/s640/Authenticate.png" width="640" /></a></div>
<br />
<div style="text-align: center;">
<span style="font-size: x-small;"><i style="font-weight: bold;">URI: </i><span style="font-family: Courier New, Courier, monospace;">https://{vrahost}/identity/api/tokens</span></span></div>
<br />
Notice the credentials being passed in the POST body? This indicates the tenant as well, so the authentication URI is consistent across all tenants. <br />
<br />
Another good step to complete is to validate your session. See the screenshot below for the example of this being performed.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIZkBLJCoJiUY-jl7s80F8pFxF6NsNoJ5MApvgYVLHegXV54UMqTH-fy7I_NpDfqIWmsjpTyGBLpTiO8o4ea5uOOj15_aRI0ItHQ6wlZuZ2m2qSumwxoHjWOFcd2MFE4479ojneILth_8m/s1600/Validate+session.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="388" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIZkBLJCoJiUY-jl7s80F8pFxF6NsNoJ5MApvgYVLHegXV54UMqTH-fy7I_NpDfqIWmsjpTyGBLpTiO8o4ea5uOOj15_aRI0ItHQ6wlZuZ2m2qSumwxoHjWOFcd2MFE4479ojneILth_8m/s640/Validate+session.png" width="640" /></a></div>
<br />
<div style="text-align: center;">
<b><i><span style="font-size: x-small;">URI: </span></i></b><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">https://{vrahost}/vcac/org/{tenant}/tokens/{tokenID}</span></div>
<br />
Note that the “<i>id</i>” returned from the authentication call is now attached as an appendix to the URI call. The successful validation is merely the <span style="font-family: Courier New, Courier, monospace;">HTTP 200</span> response code, to say that everything is OK.<br />
<br />
<h3>
Getting unfiltered content</h3>
The REST API is surprisingly easy to use, once you’ve done a little reading and poking around. I was able to pickup some basic skills with just the regular documentation and playing with the running product. I didn’t end up breaking anything, so I guess I did OK!<br />
<br />
To get the entire list of currently provisioned items, those that I am entitled to see, it a simple API call as shown below.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCR6zkg7J1DNXkAPNS8yCRwBlBoi3L146eiiyvOeQMb98g0Cut0f5Ywei-ddbPKvK4_EeWekfyjAXw3lMmgeuh_Olof1mFpNpe3uJv-ZUwAZDICDi2O3Y1IOa9uxWapVFMc3rubByhEkTi/s1600/Get+all+items.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="388" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCR6zkg7J1DNXkAPNS8yCRwBlBoi3L146eiiyvOeQMb98g0Cut0f5Ywei-ddbPKvK4_EeWekfyjAXw3lMmgeuh_Olof1mFpNpe3uJv-ZUwAZDICDi2O3Y1IOa9uxWapVFMc3rubByhEkTi/s640/Get+all+items.png" width="640" /></a></div>
<br />
<div style="text-align: center;">
<span style="font-size: x-small;"><b><i>URI:</i></b> <span style="font-family: Courier New, Courier, monospace;">https://{vrahost}/catalog-service/api/consumer/resources</span></span></div>
<br />
Note that the “<i>id</i>” token form the initial authentication is now being passed in a request header called “<i>Authorization</i>”. This represents the current session, and seem to be valid for 24 hours (by default).<br />
<br />
This API call will return ALL my items, and/or my group’s item. However, my recent dealings with a customer were needing a way to efficiently lookup a specific item in vRA, if it existed at all.<br />
<br />
<h3>
Filtering by VM name – OData queries again!</h3>
As it turns out, the vRA REST API also supports some of the <a href="http://www.odata.org/documentation/odata-version-2-0/uri-conventions/" target="_blank">OData query syntax</a> that was introduced in <a href="http://wheatcloud.blogspot.com.au/2015/07/searching-within-vrealize-automation.html">Part 1</a> of this blog. In particular, you can use the <i>$filter</i> parameter to submit a query to the API call above. See the below example for searching for a specific item (VM) by name.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd02Dcu9ObcVWGxkfN3vmfkCBTaV7vaT3jfxgALqpPFl0EY-_XY_-HJJYHINfCm4faC4_SA_WgSJAeQZmUyb6KhhfRj01cwDVZZJoczNxXrektGbcwXhGkamBae77KewcxklZBnubBNrbC/s1600/Filter+item+by+name.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="502" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd02Dcu9ObcVWGxkfN3vmfkCBTaV7vaT3jfxgALqpPFl0EY-_XY_-HJJYHINfCm4faC4_SA_WgSJAeQZmUyb6KhhfRj01cwDVZZJoczNxXrektGbcwXhGkamBae77KewcxklZBnubBNrbC/s640/Filter+item+by+name.png" width="640" /></a></div>
<br />
<div style="text-align: center;">
<span style="font-size: x-small;"><b><i>URI:</i></b> </span><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">https://{vrahost}/catalog-service/api/consumer/resources?$filter=name eq ‘win042’</span></div>
<br />
Pay attention! In this query, I am actually passing spaces in my URI! I presume this is being encoded for me by the REST Client plug-in, otherwise I assume planes would start falling out of the sky! According to the Programming Guide, the query is happy to take encoded or non-encoded form. The proper encoded call equivalent would look like one of the below.<br />
<div style="text-align: center;">
<span style="font-size: x-small;"><b><i>URI: </i></b><span style="font-family: Courier New, Courier, monospace;">https://{vrahost}/catalog-service/api/consumer/resources?$filter=name+eq+%27win042%27</span></span></div>
<div style="text-align: center;">
<span style="font-size: x-small;"><i><b>URI: </b></i><span style="font-family: Courier New, Courier, monospace;">https://{vrahost}/catalog-service/api/consumer/resources?$filter=name%20eq%20%27win042%27</span></span></div>
<br />
As you can check for yourself, if the query succeeds, it will return only the items matching the query – success! Please see below for an example of the query returning no matches. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKpWXx4GhMOO3w80A02XhHTlsBj8384btoyq_MzNmgTPtpTUbu0sgcy4bmRjAI4x0UHjvtcY-UYkTvEI-ZG-M3sFz6h3zZruijgZtz06o6-2J4Ef4h3nH8xnTz7zdy41hrTHJj1uqMedzW/s1600/Item+not+found.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="502" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKpWXx4GhMOO3w80A02XhHTlsBj8384btoyq_MzNmgTPtpTUbu0sgcy4bmRjAI4x0UHjvtcY-UYkTvEI-ZG-M3sFz6h3zZruijgZtz06o6-2J4Ef4h3nH8xnTz7zdy41hrTHJj1uqMedzW/s640/Item+not+found.png" width="640" /></a></div>
<br />
As you might notice, the API call still succeeds and returns content – it just returns a JSON document with no members in the content section.<br />
<br />
<h3>
Other query parameters</h3>
As per the previous article, the vRA REST API supports a few more of the OData parameter types. One parameter type - <i>$select</i> – is missing from the API, presumably because the structured JSON data returned is easier to navigate in full, rather than if it were teased apart into flat fields. <br />
<br />
The table below is replicated from the in-built documentation within each vRealize Automation appliance, which is a copy of the online documentation. Go ahead, check it out on your own appliance!<br />
<br />
<div style="text-align: center;">
<span style="font-size: x-small;"><b><i>Appliance Source: </i></b> <span style="font-family: Courier New, Courier, monospace;">https://{vrahost}/catalog-service/api/docs/resource_Resource.html</span></span></div>
<div style="text-align: center;">
<span style="font-size: x-small;"><b><i>Online source:</i></b> <a href="http://pubs.vmware.com/vra-62/topic/com.vmware.vra.restapi.doc/catalog-service/api/docs/resource_Resource.html">http://pubs.vmware.com/vra-62/topic/com.vmware.vra.restapi.doc/catalog-service/api/docs/resource_Resource.html</a></span></div>
<br />
<br />
<table>
<tbody>
<tr><th><div style="text-align: left;">
name</div>
</th>
<th><div style="text-align: left;">
description</div>
</th>
<th><div style="text-align: left;">
type</div>
</th>
<th>default</th></tr>
<tr><td><i><span style="font-size: x-small;">managedOnly</span></i></td>
<td><span style="font-size: x-small;">if true, the returned requests are from User's managed subtenants.</span></td>
<td><span style="font-size: x-small;">query</span></td><td></td></tr>
<tr><td><i><span style="font-size: x-small;">page</span></i></td>
<td><span style="font-size: x-small;">Page Number</span></td>
<td><span style="font-size: x-small;">query</span></td><td><div style="text-align: center;">
<span style="font-size: x-small;">1</span></div>
</td></tr>
<tr><td><i><span style="font-size: x-small;">limit</span></i></td>
<td><span style="font-size: x-small;">Number of entries per page</span></td>
<td><span style="font-size: x-small;">query</span></td><td><div style="text-align: center;">
<span style="font-size: x-small;">20</span></div>
</td></tr>
<tr><td><i><span style="font-size: x-small;">$orderby</span></i></td>
<td><span style="font-size: x-small;">Multiple comma-separated properties sorted in ascending or descending order</span></td>
<td><span style="font-size: x-small;">query</span></td><td></td></tr>
<tr><td><i><span style="font-size: x-small;">$top</span></i></td>
<td><span style="font-size: x-small;">Sets the number of returned entries from the top of the response (total number per page in relation to skip)</span></td>
<td><span style="font-size: x-small;">query</span></td><td><span style="font-size: x-small;"><br /></span></td></tr>
<tr><td><i><span style="font-size: x-small;">$skip</span></i></td>
<td><span style="font-size: x-small;">Sets how many entries you would like to skip</span></td>
<td><span style="font-size: x-small;">query</span></td><td><span style="font-size: x-small;"><br /></span></td></tr>
<tr><td><i><span style="font-size: x-small;">$filter</span></i></td>
<td><span style="font-size: x-small;">Boolean expression for whether a particular entry should be included in the response</span></td>
<td><span style="font-size: x-small;">query</span></td><td><span style="font-size: x-small;"><br /></span></td></tr>
</tbody></table>
<br />
<br />
<br />
That concludes this series of articles on searching with vRealize Automation using both Orchestrator and the REST API. Please let me know any feedback or comments below!<br />
<br />Nathan Wheathttp://www.blogger.com/profile/16568216079224543463noreply@blogger.com0tag:blogger.com,1999:blog-4265353298939347652.post-46346826135277282742015-07-06T17:02:00.003+10:002015-07-06T17:02:43.332+10:00Searching within vRealize Automation – Part 1 - OrchestratorI was recently engaged with a customer needing to execute some very particular manipulations of their provisioned virtual machines in their nascent vRealize Automation environment. I learned a few things about using search functions in both vRealize Orchestrator and the vRealize Automation REST API, and I figured it was worth sharing here.<br />
<br />
<h3>
vRealize Orchestrator</h3>
The requirement for this part was to use vRealize Orchestrator to change properties of a specific type of vRA-provisioned machine. This entailed finding all managed virtual machines that lived on a certain cluster within vCenter, and then filtering those machines by a further custom property that was being used. <br />
<br />
It tuned out to be a bad idea to use vRealize Orchestrator to do all the grabbing and manual sorting, iterating over scripts and actions to gradually reduce <u>all</u> machines down to the required subset. It was taking ages, and it was REALLY annoying to have to wait for so long before finding out I hadn’t quite nailed the search anyway! So I turned to the <i>Model Manager</i> function within the vRA IaaS component. This is one of the services that runs on Windows servers in the solution, and manages the data model quite directly.<br />
<br />
<h4>
Cluster search</h4>
I used a little bit of cheeky searching to discover the right “entity sets” and fields I needed to utilize for the search. I needed to find the UUID of the target cluster first, taking the “cluster path” that was derived from vCenter’s API structure. I handled the search as per the below code snippet.<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">var modelName = 'ManagementModelEntities.svc';<br />var entitySetName = 'Hosts';<br />var filter = "HostUniqueID eq '" + clusterPath + "'";<br />var orderBy = null;<br />var top = 1;<br />var skip = 0;<br />var headers = null;<br />var select = null;<br />var entities = vCACEntityManager.readModelEntitiesBySystemQuery(host.id, modelName, entitySetName, filter, orderBy, select, top, skip, headers);</span></blockquote>
The important parts to point out are:<br />
<br />
<ul>
<li><b>modelName</b> is indicating the standard entity model. There is a special one for AWS, for example, if I wanted to search on that instead.</li>
<li><b>entitySetName</b> is “Hosts” in the first search, which is the host or cluster running a given virtual machine. If you are running clusters, then the cluster is stored as the “host”, rather than a specific runtime host.</li>
<li><b>filter</b> is the magic part. It turns out that this complies with OData syntax, which you can read about <a href="http://www.odata.org/documentation/odata-version-2-0/uri-conventions/" target="_blank">here</a> (). In my case, the query was for a cluster path, but this is where you need to engage your brain to determine was to search for.</li>
<li><b>orderBy, top, skip, headers</b> and <b>select</b> are all modifiers for what gets returned from the search result set and how. I will come back to these in the follow up blog article where I search in the vRA REST API.</li>
<li><b>vCACEntityManager</b> is the object that executes the search, and this invocation method is the same across all my queries – just varying a couple of parameters.</li>
</ul>
<br />
<b>Virtual Machine search</b><br />
In my use case, I then wanted to find the virtual machines within the matching cluster, which was similar to above, but I used a new entitySet and filter.<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">var entitySetName = 'VirtualMachineProperties';<br />var filter = "PropertyName eq '" + propertyName + "' and PropertyValue eq '" + propertyValue + "'";</span></blockquote>
<h4>
Properties search</h4>
And the final search was to find all virtual machines with a given property – a custom property in my case.<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">var entitySetName = 'VirtualMachineProperties';<br />var filter = "PropertyName eq '" + propertyName + "' and PropertyValue eq '" + propertyValue + "'";</span></blockquote>
<b>End result</b><br />
At the end of these searches, I had two arrays of virtual machine objects. Merging these arrays in vRO was a piece of regular Javascript, looping over the data set looking for common elements.<br />
<br />
See below for the visual representation of the two searches and final merge. <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2bm2mam9rWQnfiKdDdyZaY0cEBYUnIeM-3-9Uxf-UakQJPJBjE5oVadyhL34QENfEjkGTXigfpN6hTj6kS6gv-ZEOgxjEQLN4EhMRIeIrqgexlJDoahKd7lzAeI6hoRgyJuiSRuUEA-Ls/s1600/Search+and+merge.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="83" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2bm2mam9rWQnfiKdDdyZaY0cEBYUnIeM-3-9Uxf-UakQJPJBjE5oVadyhL34QENfEjkGTXigfpN6hTj6kS6gv-ZEOgxjEQLN4EhMRIeIrqgexlJDoahKd7lzAeI6hoRgyJuiSRuUEA-Ls/s640/Search+and+merge.png" width="640" /></a></div>
<div style="text-align: center;">
<span style="font-size: x-small;">(Download the vRO actions <a href="https://www.dropbox.com/s/gjfo6j562zuulrl/com.vmware.wheatcloud.vrasearch.package?dl=0" target="_blank">here</a>, if you like.)</span></div>
<br />
In the next article, I will show a different search use case, where I needed to filter a specific VM from the vRA API.<br />
<br />Anonymoushttp://www.blogger.com/profile/14392943051539837329noreply@blogger.com0tag:blogger.com,1999:blog-4265353298939347652.post-14746587195627341242015-06-30T16:04:00.000+10:002015-06-30T16:04:55.181+10:00Integrating Infoblox IPAM with vRealize Automation - Part 3<div>
This is the last article in my series on integrating InfoBlox with vRealize Automation. <a href="http://wheatcloud.blogspot.com.au/2015/03/integrating-infoblox-ipam-with-vrealize.html">Part 1</a> discussed the general setup of the integration, and specifically how the solution looked in vRealize Orchestrator. <a href="http://wheatcloud.blogspot.com.au/2015/06/integrating-infoblox-ipam-with-vrealize.html">Part 2</a> discussed how some of the common integration elements might be used, regardless of the IP allocation approach. This last article is the guide to the specific IP allocation methods available, how to use them, and some guidance on which one might be right for you.</div>
<div>
<br /></div>
<h2>
InfoBlox integration types</h2>
<h3>
Method 1 – vRA allocates IP, registers in InfoBlox</h3>
<div>
In hindsight (as mentioned in Part 2), I believe this was the functionality I should have explored the first time! It is where you allow vRealize Automation to continue to manage its own IP pools, pick addresses for VMs, use Network Profiles and all the other goodness from vRA. However, once vRA allocates an address, it then calls out to the InfoBlox workflow to register that allocation in InfoBlox. </div>
<div>
This method assumes that there is a range of addresses that you can pre-assign to vRA usage, and that the ranges are matching between vRA and InfoBlox to ensure no conflicting usage of this range!</div>
<div>
<br /></div>
<div>
Specifically, this method picks up the following existing vRA properties that you have probably already taken care of in your vRA Network Profiles – so you don’t have to worry about them!</div>
<div>
<ul>
<li>VirtualMachine.IPaddress</li>
<li>VirtualMachine.PrimaryDNS</li>
<li>VirtualMachine.SecondaryDNS</li>
<li>VirtualMachine.DNSSuffix</li>
<li>VirtualMachine.SubnetMask</li>
<li>VirtualMachine.Gateway</li>
<li>VirtualMachine.PrimaryWins</li>
<li>VirtualMachine.SecondaryWins</li>
<li>VirtualMachine.DnsSearchSuffixes</li>
</ul>
</div>
<h3>
Method 2 – InfoBox allocates from specified network</h3>
<div>
This is the method I initially explored, and unfortunately it had the consequence that I had to disable vRA Network Profiles for my vRA Reservation (well, I created a new reservation for blueprints using IPAM) to avoid the two IP management methods from conflicting with each other. In particular, when Network Profiles are also present vRA assigns and manages the VM’s address from its own pool, and while InfoBlox was still invoked, that IPAM address was completely ignored.</div>
<div>
<br /></div>
<div>
You can specify a network is two ways. One is to specify the network/CIDR identity of the desired network. This is fine if you are dealing with a small number of distinct networks and the number of machines will not burst beyond that network’s limits. To use this approach you specify the below two custom properties:</div>
<div>
<ul>
<li>Infoblox.IPAM.netaddr – the identity of the Infoblox Network to use, such as “172.16.50.x”</li>
<li>Infoblox.IPAM.cidr – the subnet mask, such as “24”</li>
</ul>
</div>
<div>
The other way is to search for a set of networks by extended attributes. This is possibly going to match several networks (which should be equal in purpose). The cool thing about this method is that for very large environments, a virtual machine could need to exist in any number of adjacent network segments, or dynamic inputs such as location, environment, security level, etc. For instance, you may be deploying into multiple 24-bit networks that are all equivalent (internal, data access layer), and you don’t know which one will be chosen because of (a) available addresses, or (b) during provisioning there might be some request input that determines network placement.</div>
<div>
<br /></div>
<div>
The custom properties to use for searching for networks by attributes are those below:</div>
<div>
<ul>
<li>Infoblox.IPAM.searchByEa – set this to “true” to use this search method</li>
<li>Infoblox.IPAM.searchEa1Name – attribute name</li>
<li>Infoblox.IPAM.searchEa1Value – attribute value to compare</li>
<li>Infoblox.IPAM.searchEa1Comparison – comparison type, one of the following types:</li>
<ul>
<li>EQUAL</li>
<li>EQUAL_CASE_INSENSITIVE</li>
<li>GREATER_OR_EQUAL</li>
<li>LESS_OR_EQUAL</li>
<li>NOT_EQUAL</li>
<li>REGULAR_EXPRESSION</li>
</ul>
<li>… up to 10 search attributes can be specified, as below</li>
<li>Infoblox.IPAM.searchEa10Name</li>
<li>Infoblox.IPAM.searchEa10Value</li>
<li>Infoblox.IPAM.searchEa10Comparison</li>
</ul>
</div>
<div>
Using the method of IP allocation by network, Infoblox expects to fill IP details from the DHCP options already existing in the network definition in the IPAM system. However, the blueprint can specify “default” values for these, in case they are missing from Infoblox. This would certainly NOT be recommended if you would be searching for networks, as different subnet ranges might be returned. Additionally, any values found in Infoblox will override the provided values, and the blueprint values will be ignored – so it is not an override mechanism.</div>
<div>
<ul>
<li>Infoblox.IPAM.defaultGateway</li>
<li>Infoblox.IPAM.defaultPrimaryDns</li>
<li>Infoblox.IPAM.defaultSecondaryDns</li>
<li>Infoblox.IPAM.defaultPrimaryWins</li>
<li>Infoblox.IPAM.defaultSecondaryWins</li>
<li>Infoblox.IPAM.defaultDnsSuffix</li>
<li>Infoblox.IPAM.defaultDnsSearchSuffixes</li>
</ul>
</div>
<h3>
Method 3 – InfoBlox allocates from specified IP range</h3>
<div>
As you might guess, this method finds an available IP address within the specified range. This is similar to Method 2 above, but you can skip the fancy searching if you already roughly know the addressing you want for the machine. </div>
<div>
<br /></div>
<div>
The unique parameters used for this method are below:</div>
<div>
<ul>
<li>Infoblox.IPAM.startAddress</li>
<li>Infoblox.IPAM.endAddress</li>
</ul>
</div>
<div>
I would warn, however, that this method is taking the least advantage of either vRA or Infoblox functionality. This method assumes that the blueprint owner or the service requester somehow know more about the available IP environment that does either vRealize Automation or Infoblox. If this is actually the case, then you still have some major network management challenges to solve! I recommend you find a way to utilize one of the other approaches, and adapt your provisioning processes to get it right the first time…</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
This concludes this particular series of articles, all to do with vRealize Automation and Infoblox integration and use cases. Hopefully you have found some value from it. Please leave any comments or feedback!</div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/14392943051539837329noreply@blogger.com0tag:blogger.com,1999:blog-4265353298939347652.post-35705053572171878552015-06-24T15:27:00.000+10:002015-06-24T15:27:52.180+10:00Integrating Infoblox IPAM with vRealize Automation - Part 2<div class="p1">
<div class="MsoNormal">
<div class="p1">
Following on from <a href="http://wheatcloud.blogspot.com.au/2015/03/integrating-infoblox-ipam-with-vrealize.html">Part 1 of this blog article</a>, I wanted to explore how to implement the InfoBlox integration into vRealize Automation blueprints.<br />
<br />
<h2>
First approach</h2>
When first learning about how to utilize the IPAM integration, I believe I actually went down the complicated route first (Method 2, in Part 3!). I assumed I would NOT use vRA to manage and assign IP addressing at all, and would delegate this entirely to InfoBlox. In order to do this, I had to disable the vRA Network Profile in the Reservation, whose job it would normally be to create the IP information. This had two implications:<br />
<br />
<ol>
<li>In my environment, not all VM requests were going to be IPAM integrated, so I had to create a NEW Reservation in vRA, overlapping with my existing ones, with the Network Profile disabled. I then had to make duplicate blueprints to be associated with the new reservation. Of course, I could have made the Reservation Policy be dynamically selected during request, but that is just another complication.</li>
<li>Now that vRA was not supplying the networking parameters to go with the IP address (subnet mask, DNS servers, DNS suffix, etc), I had to supply this is additional vRA Build Profile properties.</li>
</ol>
<br />
So, maybe don’t do it that way…! There are two other approaches, and I’ll outline each of them in Part 3 of this series of articles. I’ll also explain below some more details about how the provisioning options work.<br />
<br />
But for now, I’ll explain some of the common elements across the integration methods.<br />
<br />
<h2>
Using the Build Profiles</h2>
After creating the initial Build Profile (as per Part 1), I went back into vRA and modified the Build Profile to pre-populate the static attributes that I knew I would use.<br />
<br />
<h3>
Common properties</h3>
There is one set of common properties that are used no matter which IPAM methodology you use. There are a number of “create-something” attributes, and you need to choose exactly what type of Infoblox record you wish to create. <br />
<br />
<h4>
DNS-integrated Host record</h4>
If you specify this option, as cannot specify any of the other below types. It is both an InfoBlox record type and a DNS record type.<br />
<br />
<ul>
<li>Infoblox.IPAM.createHostRecord</li>
</ul>
<br />
<h4>
InfoBlox address record type</h4>
You can choose between either of the below options, depending on how you plan to use InfoBlox records. I believe Fixed Address probably fits the use case most people think of for the automation use-case.<br />
<br />
<ul>
<li>Infoblox.IPAM.createFixedAddress</li>
<li>Infoblox.IPAM.createReservation</li>
</ul>
<br />
<h4>
DNS address record type</h4>
If you are not creating an InfoBlox/DNS host record (above), then you can either specify to create a DNS A record alone, or both the A and PTR records for the entry. Obviously “one or both” means you don’t choose both these options!<br />
<br />
<ul>
<li>Infoblox.IPAM.createAddressRecord</li>
<li>Infoblox.IPAM.createAddressAndPtrRecords</li>
</ul>
<br />
<h3>
Additional common properties</h3>
There are a list of additional properties created in the Build Profile, most of which I have not used. One property I did statically populate was “<b>Infoblox.IPAM.comment</b>” with a string such as “<i>Record created by vRealize Automation</i>”, so that when managing my addresses directly in InfoBlox I could quickly determine which entries are under automated management. <br />
<br />
A quick word on one other property – “<b>Infoblox.IPAM.vmName</b>”. In my view, this property is a bit redundant when using vRA, as I was already using vRA Dynamic Hostname workflows to determine a special hostname, and didn’t want to populate this separately in a new field. In my case, I went and edited a few of the InfoBlox workflows to just pickup the vRA name. <br />
<br />
My snippet of additional code is below, which was inserted into the “Retrieve Properties” workflow scripting elements.<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>vmname=vCACVmProperties.get("Infoblox.IPAM.vmName");<br /><span class="Apple-tab-span" style="white-space: pre;"> </span>if(vmname=="")<br /><span class="Apple-tab-span" style="white-space: pre;"> </span>{<br /><span class="Apple-tab-span" style="white-space: pre;"> </span>vmname=vCACVm.virtualMachineName;<br /><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span></blockquote>
<h4>
Property list</h4>
<br />
<ul>
<li>Infoblox.IPAM.vmName</li>
<li>Infoblox.IPAM.dnsView</li>
<li>Infoblox.IPAM.networkView</li>
<li>Infoblox.IPAM.comment</li>
<li>Infoblox.IPAM.enableDHCP (see comments below)</li>
<li>Infoblox.IPAM.aliases</li>
<li>Infoblox.IPAM.defaultPortGroup</li>
</ul>
<br />
Have a look through the InfoBlox to explore some other use-cases you can try out with the DNS and Network views – as these will apply well to multi-tenanted usage, overlapping network ranges, etc. This is something considerably beefed up in the later vNIOS 7.x version of InfoBlox which I haven’t covered in these articles.<br />
<br />
One last word of warning – the “<b>Infoblox.enableDHCP</b>” property is defined automatically when you generate the Build Profiles with the provided workflow. However, this property is never referenced in the later call-outs, and so might give you the wrong impression for this parameter that there is some DHCP-specific IP assignment. There is not – static IP allocation and assignment is the only method implemented, at least in the version of the plug-in I have been reviewing.<br />
<div>
<br />
<br />
That's it for this article on the common elements of integration. Please go ahead and read Part 3 to understand the juicy details of specific integration methods, and how you might actually go about using this for your own environment!<br />
<br />
Please let me know any comments or feedback!</div>
</div>
</div>
</div>
Anonymoushttp://www.blogger.com/profile/14392943051539837329noreply@blogger.com0tag:blogger.com,1999:blog-4265353298939347652.post-40926787334282298022015-03-31T15:17:00.003+11:002015-04-01T10:14:30.243+11:00Integrating Infoblox IPAM with vRealize Automation - Part 1Many customers love the idea of self-service provisioning through vRealize Automation (vRA), but do not want to give up control of IP address management (IPAM) to the new tool. I frequently see requests for us to integrate vRealize Automation into a customer’s existing IPAM solution – and pretty much every time this is the Infoblox solution. So, I thought I’d give it a go!<br />
<br />
In this first blog, I will replay how I initially configured my environment to integrate the solutions. In my next post, I will explain how I used that integration to achieve an effective server build from the vRA blueprint.<br />
<br />
In my environment, I am using vRealize Automation 6.2.1, and vRealize Orchestrator 6.0.1. For Infoblox, I used the virtual appliance vNIOS version 6.11, and their vRO plug-in version 2.4.1.<br />
<br />
For starters, I had some trouble in my past attempts to do this. The Infoblox plug-in for vRealize Orchestrator (vRO) was finicky and a little hard to work with. But Infoblox have revised their plug-ins and their core solution, and I have to say I had almost no trouble this time around.<br />
<br />
Deployment of the appliance is easy enough, documented here: <a href="https://www.infoblox.com/sites/infobloxcom/files/resources/vnios-trial-quick-start-guide_1.pdf">https://www.infoblox.com/sites/infobloxcom/files/resources/vnios-trial-quick-start-guide_1.pdf</a><br />
<br />
Deployment of the plug-in was similarly fairly easy, and documentation is provided with the plug-in itself (for which you need to register, here: <a href="https://www.infoblox.com/downloads/software/vmware-vcenter-orchestrator-plug-in">https://www.infoblox.com/downloads/software/vmware-vcenter-orchestrator-plug-in</a>).<br />
<br />
Two quirks of note that I discovered:
<br />
<ul>
<li>I could not register the vNIOS appliance to the plug-in using the FQDN. I believe this was because the appliance FQDN was a “.local” domain, and deemed as invalid. Using the IP address got around this problem, and the error message made it pretty clear that it was not happy with DNS validity, so it wasn’t hard to drill down to what alternatives to try.
<br /><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzmVV-Xwm6wTH8CRL4ZS6uX3bdzAB6P5OHZIvOMLtMLLjaDgn1XhnpwZ976nrNaSdYP3tlgOmiKMDagMXjGbr9FfFceS4Gld1YtVcUkJ8aaM7UlRiLu_BJxrP_Al3g9_VzoCnwkBo0UbmS/s1600/vRO_IPAM_Config.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzmVV-Xwm6wTH8CRL4ZS6uX3bdzAB6P5OHZIvOMLtMLLjaDgn1XhnpwZ976nrNaSdYP3tlgOmiKMDagMXjGbr9FfFceS4Gld1YtVcUkJ8aaM7UlRiLu_BJxrP_Al3g9_VzoCnwkBo0UbmS/s1600/vRO_IPAM_Config.png" height="139" width="320" /></a></div>
</li>
<li>The self-signed certificate was expired. It appears that the default certificate generated has a lifetime of one year. This was only an issue for me when trying to connect the plug-in. Again, fairly easily fixed – this time through the Infoblox System Manager web app under System – Certificates.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIxD1ma85mA31pl6iCiVvG3q9M3sYoWZcjnpPRM2mvFyF5BfuGw_HSPcfkTFc_R8k3Ko0lWeLW4iSys7NdVn-oyPhjW23TVCncnTN95Sb8UfFu9dL_ojZOyyAIfRKAfEXwa_4xDdY-GM4g/s1600/IPAM_Certs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIxD1ma85mA31pl6iCiVvG3q9M3sYoWZcjnpPRM2mvFyF5BfuGw_HSPcfkTFc_R8k3Ko0lWeLW4iSys7NdVn-oyPhjW23TVCncnTN95Sb8UfFu9dL_ojZOyyAIfRKAfEXwa_4xDdY-GM4g/s1600/IPAM_Certs.png" height="127" width="320" /></a></div>
</li>
</ul>
The vRO plug-in also requires a workflow package to be imported, to support some of the additional functions that the plug-in invokes. This package is included in the plug-in download, and included in the documented instructions.<br />
<br />
Once I installed the plug-in for my setup, I used the provided Infoblox vRO workflows to:
<br />
<ul>
<li> “<b>Install vCO customization wrapper</b>”. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOS6ioBBQZ9VcejCn-LO57gQ5X_GUTR1JtIKXGZ7rIFILQnG2CdLQ8BZ_EF9t7WmZvd91jEQyHE9SwoE9CFKmTD-AAqjzqprPsc0i1ww-UaNxolofDh7Lf-2CSrATS5PevWIyQhVbm7Jfv/s1600/Install_wrapper.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOS6ioBBQZ9VcejCn-LO57gQ5X_GUTR1JtIKXGZ7rIFILQnG2CdLQ8BZ_EF9t7WmZvd91jEQyHE9SwoE9CFKmTD-AAqjzqprPsc0i1ww-UaNxolofDh7Lf-2CSrATS5PevWIyQhVbm7Jfv/s1600/Install_wrapper.png" height="320" width="258" /></a></div>
<br />
This enabled vRA to call out to Infoblox via vRO (aka vCO) during three distinct lifecycle stages: </li>
<ul>
<li><b> Building</b> – this stage is where IP addressing is reserved in IPAM and passed back into vRA during the initial provisioning. </li>
<li><b> Provisioned</b> – once the machine is built, this calls out to the workflow “Update MAC address for vCAC VM wrapper”, which appears to grab the as-built MAC address from the VM (nic0) in order to populate Infoblox with this detail. </li>
<li><b> Disposing</b> – when the machine is destroyed, this calls-out to “Remove Host Record or A/PTR/CNAME/Fixed address/Reservation of vCAC VM wrapper”. In essence, this removes the entries made by the previous workflows.
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM9WCLZoa0Y9ZE_7iRHSpgWvD3Oqk5dEhNsj2MTl5nLkK9EmfnjHdI9TyFdjU0NYUee6GTWzjIZKOINsW4_c1DExrUQ7xzxSY04JBsMiuCWCyh_XGpY1fulxN0NG-pNDP0Ajx6msWjRkZF/s1600/Wrapper_workflow_config.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM9WCLZoa0Y9ZE_7iRHSpgWvD3Oqk5dEhNsj2MTl5nLkK9EmfnjHdI9TyFdjU0NYUee6GTWzjIZKOINsW4_c1DExrUQ7xzxSY04JBsMiuCWCyh_XGpY1fulxN0NG-pNDP0Ajx6msWjRkZF/s1600/Wrapper_workflow_config.png" height="255" width="320" /></a></div>
<br />
</li>
<li><i><u>CAVEAT</u></i>: In my environment only, the above Removal workflow does not release the IP address back into the available pool. I am still working on this, and will update this article accordingly. For the moment, I manually review the “Used” records (without any other data associated) and perform a “Reclaim” in the Infoblox management console. Strangely, this behaviour did NOT happen in a customer's environment, nor in Infoblox's own test environment. </li>
</ul>
<li> “<b>Create Build Profile for Reserve an IP for a vCAC VM in Network</b>”. This piece of absolute magic sets up a new Build Profile in vRA so that I can merely select it during blueprint definition to enable IPAM
integration. Magic!! </li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp4bLFMBWFoilqojX8s_gdaRgCBIPBB1VwTtVE1TiIwwlBUQ68ot0-NwkWXKCEUmkbeP2yJcWq-QGTdJMCRIK2qD1LXMSCLFQHXveKVbS7mn801vwOdBIYC2HEdM3njxCfZvrxmBlQIE2m/s1600/Build_Profile.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp4bLFMBWFoilqojX8s_gdaRgCBIPBB1VwTtVE1TiIwwlBUQ68ot0-NwkWXKCEUmkbeP2yJcWq-QGTdJMCRIK2qD1LXMSCLFQHXveKVbS7mn801vwOdBIYC2HEdM3njxCfZvrxmBlQIE2m/s1600/Build_Profile.png" height="256" width="320" /></a></div>
<br />
I used the “<i>in Network</i>” method of IP allocation, because I just wanted Infoblox to pick the next address within a given subnet range. I already have certain ranges carved out and reserved for other purposes (such as vRA’s own ranges that it manages, more on that later) – so anything that wasn’t already reserved is free game for Infoblox to grab. The other methods are “<i>in Range</i>” (if you have specifically carved out one in Infoblox for this purpose), or “<i>general</i>” (if the IP address to reserve is already known, perhaps through an
external process prior to the request). <br />
<br />
Once I had run these initial configuration workflows, everything was almost ready to go for vRealize Automation to utilise.<br />
<br />
This wraps up the first blog covering initial setup. In the next blog article, I will specify how vRA is configured to utilise Infoblox as part of its provisioning.Anonymoushttp://www.blogger.com/profile/14392943051539837329noreply@blogger.com0tag:blogger.com,1999:blog-4265353298939347652.post-53510352794932050932015-01-13T14:30:00.002+11:002015-01-13T14:30:28.933+11:00Explaining Hybrid Cloud to a 5 year old?<div class="tr_bq">
Someone recently pointed me to this article on Tech Week Europe on "<a href="http://www.techweekeurope.co.uk/e-enterprise/hybrid-cloud-explained-158477" target="_blank">How To Explain Hybrid Cloud To A Five-Year-Old</a>". It was not shared because of its awesomeness, but how ridiculous some of the explanations were. I completely agree, but unfortunately it made me want to create my own analogies! What a sorry state of affairs!</div>
<br />
Of course, <a href="http://it20.info/" target="_blank">Massimo Re Ferre</a> asked the obvious question "Why would anyone want to explain this to a 5 year old anyway??". As a father of two kids, brought up to ask questions and challenge their father, I reckon I've probably already been challenged to explain to them what it is that I do! But more importantly, if you can't explain this fluffy concept in simple enough terms, there's a good chance you might leave your customers, managers, executives or users with an unsettled mind about what Hybrid Cloud is all about, why they should use it, what it is NOT, and how to figure out if it's working the right way.<br />
<br />
Anyhow, I came up with two and felt the need to share. I'm sure they are terrible, but I like them. So please feel free to let me know better ones!<br />
<blockquote>
<br />(1) Hybrid Cloud is like a perfect lunch at school. You have some food you've brought from home, because that's what Mum gives you and maybe it's cheaper, or healthier or maybe you can't eat peanut butter because you're allergic, and your Mum looks after you! And then you also get some money to spend at the school canteen for a nice cold chocolate milk, or a fresh cookie. You can choose what you feel like on each day. But when you put together your healthy lunch from home and your special fun things from the canteen - you have a perfect lunch in front of you!</blockquote>
<blockquote>
(2) Hybrid Cloud is like your home. At home you have your own bedroom where you sleep and keep your toys and no one is allowed in if you don't want them to. Sometimes you play there, but sometimes you play out in the family room with everyone else. In the family room there's more space, and the big TV and other people - but that also means sometimes your toys get stepped on, or you fight with your sister, or you can't have the room all to yourself. So, you play sometimes in your room, sometimes in the rest of the house, and you have toys everywhere (but your special ones are safe in your room)! And every day, you can choose where to play!</blockquote>
Anonymoushttp://www.blogger.com/profile/14392943051539837329noreply@blogger.com0tag:blogger.com,1999:blog-4265353298939347652.post-35707340211621099182014-08-25T10:52:00.003+10:002014-08-25T10:52:57.550+10:00Report on View session history - How busy is my lab?<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">I was asked a while ago to help justify spending some money on our shared lab environment, which we use for customer demonstrations. The question really was "How much do people use the demonstration lab, really?" So, I thought there must be a way within VMware View to help figure it out. There was, and it got turned into a pretty little graph, as I'll show you below.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The first part is to extract the session data. In View's database is a table called "View_Events", which logs all sorts of things about the environment (read KB article <a href="http://kb.vmware.com/kb/2007095" target="_blank">here</a>). For my interests, I noticed it logged and event when a user got connected, and when they disconnected. I didn't care about when they were logged in, because most of us use the lab for short sharp demos, and tend to leave our desktops logged in all the time, and then quickly jump in to do a demonstration, and then jump off again. It was only the ACTIVE session count and length of stay that I wanted to know. In particular:</span><br />
<ul>
<li><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">How frequently were people connecting to the lab, and</span></li>
<li><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">How long were people in session for (quick demo, longer demo, or working on something bigger like an all-day marketing event)</span></li>
</ul>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">There was no natural way to show session duration, but the data can be derived from the session ID being attached to both the CONNECT event and the DISCONNECT event. These show up as login/logout events on the broker - "BROKER_USERLOGGEDIN" and "BROKER_USERLOGGEDOUT". Have a long look at my query below, and it'll make sense when you compare it with the results.</span><br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;"><b>USE</b> View_Events<br /><b>SELECT</b> LoginEvents.UserDisplayName AS Username, LoginEvents.EventID AS LoginEventID, LoginEvents.Time AS TimeIn, LogoutEvents.EventID AS LogoutEventID, LogoutEvents.Time AS TimeOut, LoginData.StrValue AS SessionId, LogoutEvents.Time - LoginEvents.Time AS SessionTime<br /><b>FROM</b> VE_user_events_hist AS LoginEvents <b>INNER JOIN</b> VE_event_data_historical AS LoginData ON LoginEvents.EventID = LoginData.EventID <b>INNER JOIN</b> VE_event_data_historical AS LogoutData ON LoginData.StrValue = LogoutData.StrValue <b>INNER JOIN</b> VE_user_events_hist AS LogoutEvents ON LogoutData.EventID = LogoutEvents.EventID<br /> <b>WHERE</b> (LoginEvents.Module = N'Broker') AND (LoginEvents.EventType = N'BROKER_USERLOGGEDIN') AND (LoginData.Name = N'BrokerSessionId') AND (LogoutData.Name = N'BrokerSessionId') AND (LogoutEvents.Module = N'Broker') AND (LogoutEvents.Module = N'Broker') AND (LogoutEvents.EventType = N'BROKER_USERLOGGEDOUT')<br /> <b>ORDER BY</b> LoginEvents.Time <b>DESC</b></span></blockquote>
<div class="p3">
<span style="font-family: Courier New, Courier, monospace;"></span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">If you are good at reading SQL, you might notice that the last column selected, which I call "SessionTime". This is actually a SQL calculation of logout time minus login time. This tells me how long the person was connected for.</span></div>
<div class="p3">
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="p3">
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The results look a bit like the below, when extracted as raw CSV.</span></div>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">MELB\nwheat,28366,2013-11-20 21:47:39.513,28370,2013-11-20 22:07:45.483,e2fc4503_1633_4634_8e3b_bdd8dc098438,1900-01-01 00:20:05.970</span></blockquote>
<div class="p3">
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="p3">
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Putting it through the Excel wringer, I turned it into something a LOT more palatable, as below. I also add some further calculated fields, which helps me turn it into a pretty PivotChart. The bolded fields are the ones I used for my report.</span></div>
<div class="p3">
</div>
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;"><i><b>Username</b></i></span></li>
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">I performed a find and replace to remove the unneeded 'DOMAIN\' part.</span></li>
</ul>
<li><span style="color: #999999; font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;"><i>LoginEvent</i></span></li>
<ul>
<li><span style="color: #999999; font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">Completely ignored field, but is the ID for the BROKER_USERLOGGEDIN event.</span></li>
</ul>
<li><span style="color: #999999; font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;"><i>LoginTime</i></span></li>
<ul>
<li><span style="color: #999999; font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">Event timestamp, ignored hereafter.</span></li>
</ul>
<li><span style="color: #999999; font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;"><i>LogoutEvent</i></span></li>
<ul>
<li><span style="color: #999999; font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">Completely ignored field, but is the ID for the BROKER_USERLOGGEDOUT event.</span></li>
</ul>
<li><span style="color: #999999; font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;"><i>LogoutTime</i></span></li>
<ul>
<li><span style="color: #999999; font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">Event timestamp, ignored hereafter.</span></li>
</ul>
<li><span style="color: #999999; font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;"><i>SessionID</i></span></li>
<ul>
<li><span style="color: #999999; font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">This magic field is present for both the Login and Logout event and connects the login/logout events together so I can calculate the session duration!</span></li>
</ul>
<li><span style="color: #999999; font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;"><i>SessionTime</i></span></li>
<ul>
<li><span style="color: #999999; font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">This is the field calculated in the SQL query. Unfortunately, it comes through as a timestamp, which Excel displays as "one day plus the calculated time", so I convert it below.</span></li>
</ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;"><i><b>SessionLength</b></i></span></li>
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">Added in Excel to remove the additional "day" in the timestamp above.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">Formula is {"<span class="s1">=</span>[@SessionTime]<span class="s1">-1"}</span></span></li>
</ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;"><i><b>Short</b></i></span></li>
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">Added in Excel, to be "1" if the SessionLength is less than 30 minutes (1 day / 48)</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">Formula is {"<span class="s1">=IF(</span><span class="s2">(</span>[@SessionLength]<span class="s1"><</span><span class="s3">(</span><span class="s1">1/48</span><span class="s3">)</span><span class="s2">)</span><span class="s1">,1,0)</span>"}</span></li>
</ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;"><i><b>Medium</b></i></span></li>
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">Added in Excel, to be "1" if the SessionLength is more than 30 minutes but less than 90 minutes.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">Formula is {"<span class="s1"><span class="s1">=IF(</span><span class="s2">(</span><span class="s1">AND</span><span class="s3">(</span>[@SessionLength]<span class="s1">>=</span><span class="s4">(</span><span class="s1">1/48</span><span class="s4">)</span><span class="s1">,</span>[@SessionLength]<span class="s1"><</span><span class="s4">(</span><span class="s1">1/16</span><span class="s4">)</span><span class="s3">)</span><span class="s2">)</span><span class="s1">,1</span>,0)</span>"}</span></li>
</ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;"><i><b>Long</b></i></span></li>
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">Added in Excel, to be "1" if the SessionLength is more than 90 minutes.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">Formula is {"<span class="s1"><span class="s1">=IF(</span><span class="s2">(</span>[@SessionLength]<span class="s1">>=</span><span class="s3">(</span><span class="s1">1/16</span><span class="s3">)</span><span class="s2">)</span><span class="s1">,1,</span>0)</span>"}</span></li>
</ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;"><i><b>Month</b></i></span></li>
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">Added in Excel, month extracted for my PivotChart later.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">Formula is {"<span class="s1">=(MONTH</span><span class="s2">(</span>[@LoginTime]<span class="s2">))</span>"}</span></li>
</ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;"><i><b>Year</b></i></span></li>
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">Added in Excel, month extracted for my PivotChart later.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: x-small;">Formula is {"<span class="s1">=(YEAR</span><span class="s2">(</span>[@LoginTime]<span class="s2">))</span>"}</span></li>
</ul>
</ul>
<br />
<div class="p3">
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Phew! That was a bunch of playing around, and surely someone can quickly make a template or macro out of this. But seeing as I only need to churn out a report every 6 months or so, I haven't bothered as yet. The resulting table looks like the below.</span></div>
<div class="p3">
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="p3">
</div>
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; width: 1008px;">
<!--StartFragment-->
<colgroup><col style="mso-width-alt: 3114; mso-width-source: userset; width: 73pt;" width="73"></col>
<col style="mso-width-alt: 3242; mso-width-source: userset; width: 76pt;" width="76"></col>
<col style="mso-width-alt: 4394; mso-width-source: userset; width: 103pt;" width="103"></col>
<col style="mso-width-alt: 3584; mso-width-source: userset; width: 84pt;" width="84"></col>
<col style="mso-width-alt: 4394; mso-width-source: userset; width: 103pt;" width="103"></col>
<col style="mso-width-alt: 2944; mso-width-source: userset; width: 69pt;" width="69"></col>
<col style="mso-width-alt: 3541; mso-width-source: userset; width: 83pt;" width="83"></col>
<col style="mso-width-alt: 3925; mso-width-source: userset; width: 92pt;" width="92"></col>
<col span="5" style="width: 65pt;" width="65"></col>
</colgroup><tbody>
<tr height="15" style="height: 15.0pt;">
<td height="15" style="background: rgb(79, 129, 189); border-bottom-color: white; border-bottom-width: 1.5pt; border-right-color: white; border-right-width: 0.5pt; border-style: none solid solid none; color: white; font-family: Calibri; font-weight: 700; height: 15pt; text-underline-style: none; width: 73pt;" width="73"><span style="font-size: x-small;">Username</span></td>
<td style="background: rgb(79, 129, 189); border-bottom-color: white; border-bottom-width: 1.5pt; border-left-color: white; border-left-width: 0.5pt; border-right-color: white; border-right-width: 0.5pt; border-style: none solid solid; color: white; font-family: Calibri; font-weight: 700; text-underline-style: none; width: 76pt;" width="76"><span style="font-size: x-small;">LoginEvent</span></td>
<td class="xl63" style="background: rgb(79, 129, 189); border-bottom-color: white; border-bottom-width: 1.5pt; border-left-color: white; border-left-width: 0.5pt; border-right-color: white; border-right-width: 0.5pt; border-style: none solid solid; color: white; font-family: Calibri; font-weight: 700; text-underline-style: none; width: 103pt;" width="103"><span style="font-size: x-small;"> LoginTime</span></td>
<td style="background: rgb(79, 129, 189); border-bottom-color: white; border-bottom-width: 1.5pt; border-left-color: white; border-left-width: 0.5pt; border-right-color: white; border-right-width: 0.5pt; border-style: none solid solid; color: white; font-family: Calibri; font-weight: 700; text-underline-style: none; width: 84pt;" width="84"><span style="font-size: x-small;">LogoutEvent</span></td>
<td class="xl63" style="background: rgb(79, 129, 189); border-bottom-color: white; border-bottom-width: 1.5pt; border-left-color: white; border-left-width: 0.5pt; border-right-color: white; border-right-width: 0.5pt; border-style: none solid solid; color: white; font-family: Calibri; font-weight: 700; text-underline-style: none; width: 103pt;" width="103"><span style="font-size: x-small;">LogoutTime</span></td>
<td style="background: rgb(79, 129, 189); border-bottom-color: white; border-bottom-width: 1.5pt; border-left-color: white; border-left-width: 0.5pt; border-right-color: white; border-right-width: 0.5pt; border-style: none solid solid; color: white; font-family: Calibri; font-weight: 700; text-underline-style: none; width: 69pt;" width="69"><span style="font-size: x-small;">SessionID</span></td>
<td class="xl64" style="background: rgb(79, 129, 189); border-bottom-color: white; border-bottom-width: 1.5pt; border-left-color: white; border-left-width: 0.5pt; border-right-color: white; border-right-width: 0.5pt; border-style: none solid solid; color: white; font-family: Calibri; font-weight: 700; text-underline-style: none; width: 83pt;" width="83"><span style="font-size: x-small;">SessionTime</span></td>
<td class="xl64" style="background: rgb(79, 129, 189); border-bottom-color: white; border-bottom-width: 1.5pt; border-left-color: white; border-left-width: 0.5pt; border-right-color: white; border-right-width: 0.5pt; border-style: none solid solid; color: white; font-family: Calibri; font-weight: 700; text-underline-style: none; width: 92pt;" width="92"><span style="font-size: x-small;">SessionLength</span></td>
<td style="background: rgb(79, 129, 189); border-bottom-color: white; border-bottom-width: 1.5pt; border-left-color: white; border-left-width: 0.5pt; border-right-color: white; border-right-width: 0.5pt; border-style: none solid solid; color: white; font-family: Calibri; font-weight: 700; text-underline-style: none; width: 65pt;" width="65"><span style="font-size: x-small;">Short</span></td>
<td style="background: rgb(79, 129, 189); border-bottom-color: white; border-bottom-width: 1.5pt; border-left-color: white; border-left-width: 0.5pt; border-right-color: white; border-right-width: 0.5pt; border-style: none solid solid; color: white; font-family: Calibri; font-weight: 700; text-underline-style: none; width: 65pt;" width="65"><span style="font-size: x-small;">Medium</span></td>
<td style="background: rgb(79, 129, 189); border-bottom-color: white; border-bottom-width: 1.5pt; border-left-color: white; border-left-width: 0.5pt; border-right-color: white; border-right-width: 0.5pt; border-style: none solid solid; color: white; font-family: Calibri; font-weight: 700; text-underline-style: none; width: 65pt;" width="65"><span style="font-size: x-small;">Long</span></td>
<td style="background: rgb(79, 129, 189); border-bottom-color: white; border-bottom-width: 1.5pt; border-left-color: white; border-left-width: 0.5pt; border-right-color: white; border-right-width: 0.5pt; border-style: none solid solid; color: white; font-family: Calibri; font-weight: 700; text-underline-style: none; width: 65pt;" width="65"><span style="font-size: x-small;">Month</span></td>
<td style="background: rgb(79, 129, 189); border-bottom-color: white; border-bottom-width: 1.5pt; border-left-color: white; border-left-width: 0.5pt; border-style: none none solid solid; color: white; font-family: Calibri; font-weight: 700; text-underline-style: none; width: 65pt;" width="65"><span style="font-size: x-small;">Year</span></td>
</tr>
<tr height="15" style="height: 15.0pt;">
<td height="15" style="background: rgb(184, 204, 228); border-bottom-color: white; border-bottom-width: 0.5pt; border-right-color: white; border-right-width: 0.5pt; border-style: solid solid solid none; border-top-color: white; border-top-width: 0.5pt; font-family: Calibri; height: 15pt; text-underline-style: none;"><span style="font-size: x-small;">asingleton</span></td>
<td align="right" style="background: rgb(184, 204, 228); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">1794</span></td>
<td align="right" class="xl63" style="background: rgb(184, 204, 228); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">30/6/14 10:58 PM</span></td>
<td align="right" style="background: rgb(184, 204, 228); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">1796</span></td>
<td align="right" class="xl63" style="background: rgb(184, 204, 228); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">30/6/14 11:07 PM</span></td>
<td style="background: rgb(184, 204, 228); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">7f6bfad3_7000_4d69_88d2_1c17e7276e02</span></td>
<td align="right" class="xl64" style="background: rgb(184, 204, 228); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">24:08:34</span></td>
<td align="right" class="xl64" style="background: rgb(184, 204, 228); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">0:08:34</span></td>
<td align="right" style="background: rgb(184, 204, 228); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">1</span></td>
<td align="right" style="background: rgb(184, 204, 228); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">0</span></td>
<td align="right" style="background: rgb(184, 204, 228); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">0</span></td>
<td align="right" style="background: rgb(184, 204, 228); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">6</span></td>
<td align="right" style="background: rgb(184, 204, 228); border-bottom-color: white; border-bottom-width: 0.5pt; border-left-color: white; border-left-width: 0.5pt; border-style: solid none solid solid; border-top-color: white; border-top-width: 0.5pt; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">2014</span></td>
</tr>
<tr height="15" style="height: 15.0pt;">
<td height="15" style="background: rgb(220, 230, 241); border-bottom-color: white; border-bottom-width: 0.5pt; border-right-color: white; border-right-width: 0.5pt; border-style: solid solid solid none; border-top-color: white; border-top-width: 0.5pt; font-family: Calibri; height: 15pt; text-underline-style: none;"><span style="font-size: x-small;">gorchard</span></td>
<td align="right" style="background: rgb(220, 230, 241); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">1790</span></td>
<td align="right" class="xl63" style="background: rgb(220, 230, 241); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">30/6/14 8:49 PM</span></td>
<td align="right" style="background: rgb(220, 230, 241); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">1800</span></td>
<td align="right" class="xl63" style="background: rgb(220, 230, 241); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">1/7/14 12:36 AM</span></td>
<td style="background: rgb(220, 230, 241); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">ceb28d1a_8bad_47cb_80c4_a793e9dc42ce</span></td>
<td align="right" class="xl64" style="background: rgb(220, 230, 241); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">27:47:22</span></td>
<td align="right" class="xl64" style="background: rgb(220, 230, 241); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">3:47:22</span></td>
<td align="right" style="background: rgb(220, 230, 241); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">0</span></td>
<td align="right" style="background: rgb(220, 230, 241); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">0</span></td>
<td align="right" style="background: rgb(220, 230, 241); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">1</span></td>
<td align="right" style="background: rgb(220, 230, 241); border: 0.5pt solid white; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">6</span></td>
<td align="right" style="background: rgb(220, 230, 241); border-bottom-color: white; border-bottom-width: 0.5pt; border-left-color: white; border-left-width: 0.5pt; border-style: solid none solid solid; border-top-color: white; border-top-width: 0.5pt; font-family: Calibri; text-underline-style: none;"><span style="font-size: x-small;">2014</span></td>
</tr>
<!--EndFragment-->
</tbody></table>
<div class="p3">
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="p3">
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">This told me everything I need to know, but it's not really in "Management language" - by which I mean a pretty graph! The last part is to quickly turn this into a PivotChart using the Excel wizards. The only difference being that I interpret "short" sessions to be "Quick demo", "medium" to be "Full demo", and "long" to be "Event or workshop".</span></div>
<div class="p3">
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="p3">
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The pretty output of my report is shown below. Vertical axis is session count, and horizontal axis is the first six months of this year.</span></div>
<div class="p3">
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi75OUSFQEw6oBEoNqa6K0DxyRsyym-b9_J1q2dCzVCcq43mDa97M_-2C2WQbO8pFZlM1ebslLrC2FZXYdgKkKJ54O09nZqy0oVTaBs3xyFH9VpjYjEPnjp0YKTHLzDcILS7QQU_XwzEL-B/s1600/Screen+Shot+2014-08-25+at+10.37.50+am.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi75OUSFQEw6oBEoNqa6K0DxyRsyym-b9_J1q2dCzVCcq43mDa97M_-2C2WQbO8pFZlM1ebslLrC2FZXYdgKkKJ54O09nZqy0oVTaBs3xyFH9VpjYjEPnjp0YKTHLzDcILS7QQU_XwzEL-B/s1600/Screen+Shot+2014-08-25+at+10.37.50+am.png" height="356" width="400" /></a></div>
<div class="p3">
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="p3">
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="p3">
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">This did in fact result in some money being spent on our environment, and partly because I was able to show the usage frequency, and indicate what kind of thing people are doing in our View environment. I hope you've found this useful, and that you can do this directly yourself in your environment, or enhance this report even further with a bit of tinkering. Please contact me if you'd like the sample file that goes with this (although I'm sure you can re-create), or if you have a better version you'd like to contribute back!</span></div>
<div class="p3">
<br /></div>
Anonymoushttp://www.blogger.com/profile/14392943051539837329noreply@blogger.com0tag:blogger.com,1999:blog-4265353298939347652.post-5775894443162929052014-01-20T13:23:00.002+11:002014-01-20T13:23:22.843+11:00VCAP-CID and VCAP-DCD exam experiencesI recently studied and passed the VMware Advanced Certified Professional (VCAP) level exams for both Cloud Infrastructure Design (VCAP-CID) and Data Center Design (VCAP-DCD). It was an interesting experience, and well worth the process for any considering them.<br />
<br />
I was part of a study group with @GrantOrchard and @Josh_Odgers, and those guys really helped me focus on a study structure. In both exams, our general approach was to work through the Exam Blueprint, which has been the strong recommendation by VMware Education and pretty much everyone else who cares to comment! I can validate that approach. Using the Blueprint, you know exactly what you're going to be examined on, and it will draw your attention to your weaker areas.<br />
<br />
My natural behaviour was to skim through the blueprint and ummm and ahhh at each section, thinking about what it meant. In my more productive moments, I would feel a little nervous and be prompted into a sideline of reading the Best Practice papers for the area. When getting into the group, however, this casual attitude was firmed up into some very useful whiteboarding exercises. Some of the exercises were drawing up a table - like a permission or role matrix. This was the content which I just had to memorise, as the "logic" you might use in your own workplace could be irrelevant for the exam. The exam is looking for certain organisational roles, and choices of permission management, which may have no bearing on how YOU would do it in real life.<br />
<br />
For the VCAP-CID, almost everything you need to know is in the vCAT (plus a little bit of Chargeback docs).<br />
<br />
The absolute BEST exercises were modelling the design scenarios, of which there are a few in each exam. These take some time to answer, and are not always easy to draw in the exam, so having them clear in your mind is a great start. For each of the study areas, we would try to imagine "What would be a design exercise for this?" - and then try to draw out a scenario. This was awesome in a group, because inevitably it would start a discussion or argument about exactly what might be asked, and exactly what a "good answer" might contain. For me, this is where the rubber hit the road. Once we had a good set of scenarios we had worked through, we would then be in a good position to wonder how it might expand/change, or if we were missing a scenario so far.<br />
<br />
<h4>
My VCAP Design study tips</h4>
<br />
<ul>
<li>Find some colleagues, and study in a group. If you're semi-confident, then a minimum of 5-6 sessions would be a good idea. </li>
<li>Follow the Exam Blueprint as your study blueprint. It tells you what you will be asked. Pore over it and make sure you could answer questions about all the areas.</li>
<li>If you're feeling weak in areas, download the Best Practice whitepaper for the topic and make sure you understand the content, and why recommendations are given. I found the below ones the most useful for me.</li>
<ul>
<li><a href="http://www.vmware.com/files/pdf/techpaper/vsphere-distributed-switch-best-practices.pdf" target="_blank">vSphere Distributed Switch Best Practices</a></li>
<li><a href="http://www.vmware.com/files/pdf/support/landing_pages/Virtual-Support-Day-Best-Practices-Virtual-Networking-June-2012.pdf" target="_blank">Virtual Networking Best Practices</a></li>
<li><a href="http://www.vmware.com/files/pdf/support/landing_pages/Virtual-Support-Day-Storage-Best-Practices-June-2012.pdf" target="_blank">Storage Best Practices</a></li>
<li><a href="http://www.vmware.com/files/pdf/techpaper/vmw-vsphere-high-availability.pdf" target="_blank">vSphere High Availability</a></li>
<li><a href="http://www.vmware.com/cloud-computing/cloud-architecture/vcat-toolkit3.html" target="_blank">VMware vCloud Architecture Toolkit</a> (for CID)</li>
</ul>
<li>Get a whiteboard. A big one!</li>
<li>For each study area, pick two design scenarios you think might come up and work through them in the group. Nut it out, argue about it, ask what else they might want. Don't forget you'll be starting from Business Requirements, so that has to be the start of the scenario!</li>
</ul>
<br />
<h4>
Are you ready?</h4>
Well, that is something you will only know AFTER the exam! However, my guidance on the exams is below. Do take it with a grain of salt, as everyone will have a different experience.<br />
<br />
<h4>
VCAP-DCD</h4>
In my opinion, this exam was quite good, and not particularly scary. Trying to sit down and focus for 3.5 hours is the biggest problem for candidates. I reckon I was mentally "done" by about 2 hours into it. So a VERY good sleep the night before is recommended - don't sit up studying late the night before. It will hurt you.<br />
<br />
Anyone that has a VCP-DV has the vSphere technical knowledge, I think. In addition to this, the rest of the knowledge comes from using that feature set with customers' real problems. I would say that if you have been spending the last 2-3 years implementing vSphere or acting in a (modestly detailed) technical pre-sales capacity for vSphere solutions, then you should be right to go.<br />
<br />
I have recommended that ALL my VMware SE colleagues just go for it. Both <complete id="goog_1346944141">@GrantOrchard and </complete>@Demitass<span id="goog_1346944149"></span><span id="goog_1346944150"></span>eNZ recommended that I just book it without study. While I did study beforehand, it probably didn't help much - they were right.<br />
<br />
<h4>
VCAP-CID</h4>
Now, this one is a different kettle of fish. This exam was challenging on more ways than one. I believe it is perhaps still a little new in the sense that the exam content is nowhere near as refined/evolved as the DCD exam. I found quite a few of the questions were either (a) unanswerable because of vagueness or ambiguity, or (b) unanswerable because the answers presented all seemed wrong. I am happy to trust that the exam could be 100% correct and I am a bit thick, but for some questions I was still unable to derive a correct answer even several days later, when thinking back on it.<br />
<br />
The other challenge was that at least one of the design scenarios seemed to be broken. That is, I couldn't correctly connect up the elements, no matter what I tried. Perhaps I was marked correctly anyway, but I doubt it - and the drawing tool just would not play ball.<br />
<br />
I failed my first attempt at this one (VCAP-CID), and so I can verify that it was not a one-off problem. I also noticed that the question pool must be quite small, so unfortunately my second sitting was probably a bit unfair as I found myself in front of a lot of familiar (and previously considered) questions. <br />
<br />
<h4>
Failure?</h4>
My biggest factors in failing the VCAP-CID exam the first time around were two that are well known among all other candidates:<br />
<br />
<ul>
<li>Lack of sleep the night before. I had trouble sleeping due to an unrelated event, so while I got to bed early, I spent a lot of time listening to the night pass by! This meant my brain was struggling to concentrate, and most questions took 2-3 reads before I understood what was needed.</li>
<li>Time management. I ran out of time. In fact, on a "pro-rata" basis, I got about the same score on both attempts, for the questions I got to. The first time I got nearly three quarters through, and just failed by a few points. The second attempt I finished quite early, and passed pretty well. I thought I was managing OK the first time, but obviously my brain was operating at an entirely too slow rate! (Due to the first factor above).</li>
</ul>
<h4>
Conclusion</h4>
<div>
If you've been a "vSphere guy/gal" for a while, and kept your VCP status up to date, just do the VCAP-DCD. It's a fine exam, and is a good test of what you're probably doing day to day anyway.</div>
<div>
<br /></div>
<div>
If you attempt the VCAP-CID, be prepared for a poorer quality exam, and a lower achievable score (I think). And keep the vCAT close...</div>
<div>
<br /></div>
<div>
Good luck!</div>
<br />
<complete><br /></complete>
<complete><br /></complete>Anonymoushttp://www.blogger.com/profile/14392943051539837329noreply@blogger.com0tag:blogger.com,1999:blog-4265353298939347652.post-24296107187512280772013-09-09T09:31:00.002+10:002013-09-09T09:31:39.691+10:00Performance definitions that should existWhen it comes to Cloud Computing, understanding service and performance definitions is a key hurdle, and one that is usually new to organisation looking to make a move to a Private Cloud, or perhaps considering adoption of a Cloud Provider.<br />
<br />
When Cloud Computing was first being talked about, and particularly Private Cloud situations, I recall VMware sales teams (including me) illustrating service tier distinctions based on such things as uptime. For example, tier 1 workloads get vSphere HA, and not tiers 2 or 3. But looking back on this, whatever was real the operational cost of having vSphere HA enabled? Certainly nothing to do with human effort. Maybe some extra capital cost for some redundant hardware, but that should exist in all vSphere environments anyway. I haven't seen any vSphere implement that intentionally build in NO redundant Ethernet/FC links, or host failover capacity. It just isn't sensible to do this for the mere sake of creating a lesser tier of infrastructure.<br />
<br />
The next key candidate for definitions used with tiers of service was performance, which is the topic of this blog article. This implied an expensive and high performance tier, versus a cheaper but lower performance tier. <br />
<br />
The example representation of these performance tiers was storage types. That is, tier 1 applications would be put on fast disks, maybe some nice 15K RPM Fibre Channel drives, and tier 2 applications would be put on relatively slower, cheaper disks such as some 7200 RPM SATA drives. OK, that sounds somewhat justifiable. But what happens if the fast disk was hopelessly over-committed (because in the absence of an <a href="http://wheatcloud.blogspot.com.au/2013/05/showing-back-it-costs-to-business.html" target="_blank">effective cost model</a>, everyone selected the "best" levels!) and the tier 1 applications got terrible performance. Meanwhile, the "cheap" SATA drives might have been under-used, or lucky enough to have non-demanding applications, and performed the same as the tier 1 disks? Whoops. Something is clearly missing from these common examples of performance definitions. <br />
<br />
Here's my proposal: define performance in terms of guarantees of response from the infrastructure. Specifically, what I mean is that when an application needs to perform disk I/O, it gets a certain response time. When it needs access to CPU or memory, it does or doesn't have to wait/contend for these resources. Putting this into "VMware engineer" speak, or my version of it, the performance definition might contain terms such as the list below. <b>Obviously, the actual numbers here are fictitious</b> and would need to reflect a real SLA.<br />
<br />
<h3>
CPU </h3>
<br />
<ul>
<li><b>Maximum/peak speed guaranteed = 2.2GHz.</b> This would be max vCPU speed, matched or bettered by the underlying hardware or CPU Limit imposed by vSphere.</li>
<li><b>Reserved speed guarantee = 10% of configured.</b> This would be the CPU Reservation imposed by vSphere, and in theory in the minimum kept available for the VM as a whole, across all vCPUs.</li>
<li><b>CPU Ready time guaranteed to be below 100 milliseconds, as an average for each 20 second period.</b> This one is the real trick, in my view. You can guarantee all the CPU Reservation you like, but if CPU Ready is holding high at some crazy value like 3000ms, the application will suck. This can be a tricky one to back up, because there are many factors that contribute to CPU Ready time, not least being the number of multi-vCPU workloads created by the tenant/user that are competing for co-scheduled CPU time, and perhaps out of the hands of the infrastructure provider. How this service level is maintained would be a combination of carefully monitoring the over-commitment of vCPUs, and the number of 2, 4, 8 or more vCPU VMs are supported in a cluster. It would be prudent to prohibit certain sizes of VM for a given service, but perhaps this is truly just something that needs monitoring and reporting by the Operations team.</li>
</ul>
<br />
<h3>
Memory</h3>
<br />
<ul>
<li><b>Reserved memory guarantee = 50% of configured.</b> Ensures that at least this much physical memory is present for the VM. This one is reasonably uncomplicated, and imposed by vSphere for the VM.</li>
<li><b>Hypervisor maximum swap rate = 400 pages/second.</b> By this, I mean the disk swapping of VM memory handled by the hypervisor (ESXi), not the hypervisor's own memory, and not the disk swapping performed by the VM's guest operating system. This might be worth further consideration, but it is a way to ensure that even though not all memory is guaranteed, the platform will have capacity to support the workloads as a whole without grinding to a halt. My motivation for including this is due to extrapolating on the Memory Reservation being pushed to its defined limits. Let's say that memory is indeed reserved for each workload at 50%, but the service provider only provisions exactly enough memory to meet that definition. In other words, the rest of the memory space for VMs requires ESXi swapping to disk. Now, it should be clear that the performance will be pitiful, and all tenants/users will rise up in revolt - but against what? The provider has met their guarantees! He didn't say your application was guaranteed to perform well, and how could he for your complicated application? This is a harsh situation if the infrastructure provider is internal to the business and the tenant can't just jump ship. The tenant WILL find a way to go elsewhere - so it must be fixed. Anyhow, expressing a maximum swap rate is one way to provide a guarantee that, while the unreserved memory may be under contention across the workloads, it will only be up to a point. This is enforced by the Operations team making the right choices for memory over-commitment on the platform, and monitoring it. An early warning sign would be when Memory Ballooning activity starts to rise - ESXi is asking the VM guest OS for help!</li>
</ul>
<br />
<h3>
Storage performance</h3>
<br />
<ul>
<li><b>Maximum disk operations per second = 400 per VM.</b> This is to ensure that there is a limit to noisy neighbours, and just good practice to ensure consistency of service. Otherwise, early adopter customers will be disappointed when their initial blindingly-fast speed is diminished to "regular" levels as more customer workloads come on board. vSphere Storage I/O Control can step in here.</li>
<li><b>Minimum guaranteed disk operations per second = 25 per VM.</b> This is just like CPU guarantees - this ensures that a VM will be at least able to hobble along with a certain amount of throughput.</li>
<li><b>Maximum storage latency guaranteed to be below 80 milliseconds, as an average over each 20 second period.</b> Again, this one for me is the real trick. I have come across a few terrible environments over the years (storage vendors to remain unnamed!) which struggled desperately with their VMware environment because of storage latency. Storage throughput is one thing, but if that throughput is happening behind a veil of sluggish response, the application will suck. Think of it akin to your Internet speeds. You might have amazing 150Mb/s sitting at your home office (I wish), but terrible response time (pings). Great for watching buffered videos, but if you're playing Call of Duty you're going to get hammered. OK, perhaps not the most business-relevant example. How about this - if your atom-smasher application is producing gigabytes of output data for storage, high throughput is fine. But if your database on an accompanying VM is doing lots of small operations that are each slowed down by poor disk latency, the database will suck, regardless of the throughput available.</li>
</ul>
<br />
<h3>
Storage space</h3>
<br />
<ul>
<li><b>All configured storage will be available.</b> This might be needed to ensure that the tenant is not left high and dry because the service provider forgot to manage their thin provisioning in time!</li>
<li>This is also where broader service levels would be described around data backup and/or replication, data retention, and data recovery times. In addition, if the context is an external Cloud Provider, you would also define data confidentiality, data erasure on VM deletion and/or service termination (a critical one, but usually absent), and data access by third parties. It is worth being clear to define such things as legal jurisdiction, as the Australian Federal Police (and similar bodies in all countries) ultimately still have power to confiscate data in justified circumstances. Department of Homeland Security and Anti-Terrorism laws didn't really change anything here, sorry guys.</li>
</ul>
<br />
<div>
Please keep in mind, that this is all in support of defining <b>differentiated</b> performance levels. The point of defining any of the above numbers is to create a performance expectation (or even guarantee), sure, but also to enable an infrastructure provider to express the precise difference between what is meant by "<i>Gold</i>" and "<i>Silver</i>" services, for instance. Thus, one set of performance numbers would be appropriate for the better service level, and a different set of numbers might support the lesser service level. <br />
<br />
And don't forget, this is not necessarily about external service providers - all this should apply equally well to a business's own internal IT practice. In fact, the business should first have some understanding of these numbers in order to understand what an external provider is offering, and how suitable the offering would be for the business. How else can the business know whether is it going to win or lose by changing to or between service providers? Price? Bah. The last thing I need is a bunch of unscrupulous cheap cloud providers creating a poor reputation for "going to the cloud".</div>
<div>
<br /></div>
<div>
I need to point out that some of these performance definitions can be controlled using technical platform features, and some can't - or might be difficult. vSphere has some fantastic capabilities in all these areas, and these should be used to create a well understood performance tier. Some of these capabilities are exposed to higher-level products such vCloud Director and vCloud Automation Center - but certainly not all. This is where a clever IT practice will need to determine which can be integrated as part of the service, and perhaps even orchestrated using vCenter Orchestrator or similar mechanisms. Other aspects of these guarantees will not be implemented as technical controls - CPU Ready time being one example. It is just going to require a switched on Operations team that is aware of what they are managing, why they are managing those numbers, how they gain visibility to these things, and what to do about it when numbers are breached or under threat of a breach.</div>
<br />
That's my quick list of some considerations for performance definitions that I think are glaring in their absence from service tier discussions. Perhaps they exist, and I would love to hear from you if I have overlooked you or your favourite service provider. In addition, I have only come up with my own thoughts on some very important numbers and considerations - but I am certainly no VCDX. I am sure I have missed a bunch of additional metrics that are just as important, or perhaps supersede my suggestions. Or perhaps, you disagree with what I have proposed above. In any case, please raise your voice - either in comments below, or ping me a note!<br />
<br />Nathan Wheathttp://www.blogger.com/profile/16568216079224543463noreply@blogger.com0tag:blogger.com,1999:blog-4265353298939347652.post-73617080628738620442013-08-18T21:24:00.000+10:002013-08-18T21:26:24.638+10:00Charging your cloud customer costs they want to seeIn an earlier blog, I described a simple way to start building a cost model based on infrastructure cost recovery. This approach tried to account for costs actually incurred, so that you could have a good idea of who is using your infrastructure budget, and maybe have a basis for charging them. Obviously, this is what all service providers need to understand, but it is also something that many IT practices are starting to tackle.<br />
<br />
The problem with that approach, however, is that if you passed the resulting costs onto a customer based on the "actual cost" idea, you would be spending a lot of time arguing with your customer. The customer (whether internal business or an external customer) would query how the hell they ended up with a bill of $5,127.63 this month, when last month it was $3,502.24. This is a good lesson I learned from talking to service providers. Customers are very gun-shy of the "shocking mobile phone bill" event. Anyone paying for an IT service is VERY keen for it to be predictable, consistent from month to month, and easily understood.<br />
<br />
So, how to marry these two ideas? On the one hand, the provider side of the service has definite costs, and those costs need to be accurately tracked and apportioned out to the users of that service. And on the other hand, the customer doesn't want to end up with highly fluctuating costs, unpredictable bills, and NEVER to receive some huge bill they can't explain. The "inexplicable bill" is a problem, even when a customer is willing to deal with the varying bills. What I mean by that is, when a bill comes and the customer queries it, how would the provider explain how those particular numbers got calculated? Do you imagine a conversation where the customer is interested in how many CPU cycles were consumed, Bytes transferred, memory consumed on physical server, etc? I can imagine a shouting match full of accusations, doubts, lack of trust, and ultimately an unhappy experience.<br />
<br />
The insight from a few of my service provider friends was "the simple cost model". I guess it's nothing magic - but it makes good sense as part of a "dual cost model". One for internal validation of real costs incurred. The other for something you can confidently invoice, explain and backup with simple data. <br />
<br />
Take a cursory look around a few IaaS provider price lists, and you'll find some easy examples. For instance, $35/month for a virtual machine of a standard size. Other costs might include certain specific resources added to the VM configuration, like another vCPU or disk, or larger memory size. I think the key to making this work simply is to limit the sizing choices available to the customer, so that prices increment is only a small number of known ways. Then it is easy to look at a list of customer VMs, and without the aid of a spreadsheet or detailed metrics, you could quickly work out the cost of that setup. Thus, a customer knows what they're up for, and can understand an invoice when it arrives, AND can have a conversation with the provider about it without it turning into a frustrated screaming match!<br />
<br />
Now, I did mention before about how to marry this "outward cost" with the accurate internal cost. This is a reconciliation exercise that should be done on a regular basis, to ensure that whatever the customers are being charged is as close as possible to the real costs incurred (and maintaining whatever profit margins to go with it). You might find that the "incurred cost + margin" and the "invoiced revenue" would vary by 10% either way from month to month - but as long as the two numbers gravitate near each other over time, you are winning! And as variances become clear, then the customer model might need some slight adjustment. Why adjust only the customer model? Because the internal model is based on real costs and should be the more accurate number, and the customer model is intentionally simplified and a bit artificial.<br />
<br />
Well, hopefully those thoughts make sense. One cost for keeping internal, and a simpler derived cost for charging on to your customers/users. This approach should make sense regardless of whether you are providing services to your own business users, or to commercial customers.<br />
<br />
Happy modeling, and as always please throw any comments back my way!Nathan Wheathttp://www.blogger.com/profile/16568216079224543463noreply@blogger.com0tag:blogger.com,1999:blog-4265353298939347652.post-9795120346731753062013-06-11T09:05:00.002+10:002013-06-11T10:34:23.143+10:00The Ever-Versatile vCenter Orchestrator<!--[if gte mso 9]><xml>
<o:DocumentProperties>
<o:Revision>0</o:Revision>
<o:TotalTime>0</o:TotalTime>
<o:Pages>1</o:Pages>
<o:Words>5</o:Words>
<o:Characters>29</o:Characters>
<o:Company>VMware</o:Company>
<o:Lines>1</o:Lines>
<o:Paragraphs>1</o:Paragraphs>
<o:CharactersWithSpaces>33</o:CharactersWithSpaces>
<o:Version>14.0</o:Version>
</o:DocumentProperties>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]-->
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>JA</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
<w:UseFELayout/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="276">
<w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]-->
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:Cambria;
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;
mso-ansi-language:EN-US;}
</style>
<![endif]-->
<!--StartFragment-->
<!--EndFragment--><br />
<h2>
<span lang="EN-US">Solving a Simple Backup Problem </span></h2>
<div class="MsoNormal">
<span lang="EN-US">
vCenter Orchestrator is a bit of a dark horse in the VMware product portfolio. Almost every customer has it, because it is licensed along with every vCenter Server, but almost every customer has never touched it. It is actually a VERY powerful tool to have in your toolbox.</span><br />
<span lang="EN-US">Of course, I’m a strong opponent against using orchestration-centric approaches to building a self-service and/or cloud environment. The two-part problem is that</span><br />
<ol>
<li><span style="text-indent: -18pt;">Orchestration designs, “great” as they might be, need to touch many
pieces of technology in the datacenter.
While no single element of integration may be a particular challenge,
this up-front implementation of many moving parts is costly and time-consuming
– and such solutions will typically take 6 months or more, and cost several
hundreds of thousands of dollars in services alone. </span></li>
<li><span style="text-indent: -18pt;">Orchestration designs are hypersensitive to any technology changes
over time. That is, you are likely to
break the intricate machine whenever you perform a software upgrade, firmware
upgrade or hardware model change. That
is usually guaranteed to happen yearly (or half-yearly) for software, and every
few years for hardware. Multiplied by
10-15 moving parts, or more, that means the solution is never actually stable
for any length of time – or else it holds the business back from making
necessary changes.</span></li>
</ol>
<span lang="EN-US">Well, having said all that, orchestration
has its place. If it was on the food pyramid,
it might be “fats and oils”. Rich in
energy, necessary as part of a complete diet, but you have to take it easy or
else it’ll lead to heart attack, or perhaps an inability to leave your front
door!<span style="mso-spacerun: yes;"> </span>OK, so it’s not the best analogy…
but hopefully the point sticks.</span>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7fcWMF4tDsGvDZJETRwo1Ji4emOjJo1GvtDaiQJcC6X_d3CWXPFrmxQiyQp2eSA4YEwspvVRlTewDAcDogDp55A8sfbxoRWM93icCJVyQvoedl8SzDjj5SJOSYdSifcwvhmGbCMmadA1t/s1600/Slide1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7fcWMF4tDsGvDZJETRwo1Ji4emOjJo1GvtDaiQJcC6X_d3CWXPFrmxQiyQp2eSA4YEwspvVRlTewDAcDogDp55A8sfbxoRWM93icCJVyQvoedl8SzDjj5SJOSYdSifcwvhmGbCMmadA1t/s400/Slide1.png" width="400" /></a></div>
<div class="MsoNormal">
Last year, a customer was seeking a way to
achieve a simple backup method, to safeguard their remote offices from VMs
breaking through software changes, updates or “tinkering”.<span style="mso-spacerun: yes;"> </span>Each site had an ESXi standalone host managed
by a central vCenter Server, local storage, and fair to poor WAN links.<span style="mso-spacerun: yes;"> </span>We decided to explore using vCenter
Orchestrator to create application consistent, on-site, self-managing
backups.<span style="mso-spacerun: yes;"> </span>What we ended up with looked
pretty useful, so I thought I would share it here. <span style="mso-spacerun: yes;"> </span>It also only took a few days for us to put
together, Peter Marfatia and I, which I thought was pretty reasonable for a
team with limited skills in the tool.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">I have included a link to the resulting
package at the bottom of this article, and also the automatically generated documentation that
vCenter Orchestrator provided for me.<span style="color: red;"><o:p></o:p></span></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">To get started with vCenter Orchestrator,
there are some great resources out there – some I’ve included at the bottom of
this article.<span style="mso-spacerun: yes;"> </span>It is a great learning experience
to install the Orchestrator Appliance and Client, and just look around at the
various actions, workflows and tools that it makes available.</span></div>
<div class="MsoNormal">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5B5bUTdvk4x43sAgfAQnZIIkA0IdQZ9Z7X9B6SkPD8ZEaA9xhm0U5VtfU-cOweT_vNelaGGvDLv0bldetFU1eViiwpjerRV6N7lq839q-sMAiy64wO5EHD5nNgBJzpF8ywhhOekIwDov3/s1600/Screen+Shot+2013-05-22+at+11.37.31+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5B5bUTdvk4x43sAgfAQnZIIkA0IdQZ9Z7X9B6SkPD8ZEaA9xhm0U5VtfU-cOweT_vNelaGGvDLv0bldetFU1eViiwpjerRV6N7lq839q-sMAiy64wO5EHD5nNgBJzpF8ywhhOekIwDov3/s400/Screen+Shot+2013-05-22+at+11.37.31+AM.png" width="400" /></a></div>
<br /></div>
<h2>
<span lang="EN-US">The Overall Backup Process<o:p></o:p></span></h2>
<div class="MsoNormal">
<span lang="EN-US">Perhaps to start with, a view of the
overall process we used for this Branch Backup would help.<span style="mso-spacerun: yes;"> </span></span></div>
<div class="MsoListParagraphCxSpFirst" style="mso-list: l2 level1 lfo3; text-indent: -18.0pt;">
<ol>
<li><span lang="EN-US">The workflow is pointed to a folder within vCenter</span></li>
<li><span lang="EN-US">It discovers all virtual machines within that folder, and determines
whether they are candidates for backup, or are instances of prior backups.</span></li>
<li><span lang="EN-US">If requiring backup, it performs a snapshot with quiescing, then
clones the snapshot to a new VM, which is converted to a template (to prevent
accidental power-ons).</span></li>
<li><span lang="EN-US">If looking at prior backups, removes those no longer needed.</span></li>
<li><span lang="EN-US">When all backups have been processed, the workflow emails a report
to a nominated address.</span></li>
</ol>
</div>
<h2>
<span lang="EN-US">Backup Dispatcher<o:p></o:p></span></h2>
<div class="MsoNormal">
<span lang="EN-US">This is the main entry point into the whole
workflow.<span style="mso-spacerun: yes;"> </span></span></div>
<div class="MsoNormal">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrIplhsDKtmMhWNQeYXzoAklTDJPAcp-8U_JJNw_KssVrm9b1K5aidQiTcsnkEMJq6Yh_04vXkRSrkDiiTLNVvLLlWlIn_WimoRlBiXbGGHH5yWvt4lZJ2Dg_hEZpFNXqsdO0i6oqIumsM/s1600/BackupDispatcher.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrIplhsDKtmMhWNQeYXzoAklTDJPAcp-8U_JJNw_KssVrm9b1K5aidQiTcsnkEMJq6Yh_04vXkRSrkDiiTLNVvLLlWlIn_WimoRlBiXbGGHH5yWvt4lZJ2Dg_hEZpFNXqsdO0i6oqIumsM/s640/BackupDispatcher.png" width="640" /></a></div>
<br /></div>
<div class="MsoNormal">
<span lang="EN-US" style="font-family: Times; mso-bidi-font-family: Times; mso-no-proof: yes;"><!--[if gte vml 1]><v:shape id="_x0000_i1032" type="#_x0000_t75"
style='width:415pt;height:156pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file://localhost/Users/nwheat/Library/Caches/TemporaryItems/msoclip/0/clip_image005.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">You can see that in vCenter Orchestrator,
there is a visual layout of the workflow steps, like all other orchestration
tools.<span style="mso-spacerun: yes;"> </span>Even if this is the first time
you’ve seen orchestrator, you can look at the diagrams and have a fair
understanding of what is happening when the workflow is run. <o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">When running the job manually, the workflow
asks a small number of questions as shown below.<span style="mso-spacerun: yes;"> </span>This is the default user interface presented
by the Orchestrator Client, and others are available – check out the VMware
Labs site for some options. <o:p></o:p></span></div>
<div class="MsoNormal">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf2wgVmic93r3IHIGIM_06FYVthEo22mWKjSjiNDcBPCnoP5tGptmYchj2zbET6Qn11gd-1L2xlRbP13juSYG_5sqMwhhKgalJHtNdZ7cswgq3je4M5k-kc1oePO1YrI2HuaKxCy3fOt6y/s1600/Screen+Shot+2013-05-22+at+3.15.56+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="315" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf2wgVmic93r3IHIGIM_06FYVthEo22mWKjSjiNDcBPCnoP5tGptmYchj2zbET6Qn11gd-1L2xlRbP13juSYG_5sqMwhhKgalJHtNdZ7cswgq3je4M5k-kc1oePO1YrI2HuaKxCy3fOt6y/s400/Screen+Shot+2013-05-22+at+3.15.56+PM.png" width="400" /></a></div>
<br /></div>
<div class="MsoNormal">
<span lang="EN-US" style="mso-no-proof: yes;"><!--[if gte vml 1]><v:shape
id="Picture_x0020_2" o:spid="_x0000_i1031" type="#_x0000_t75" alt="Description: Macintosh HD:Users:nwheat:Documents:VMware:Documents:Blog:vCO Backups:Screen Shot 2013-05-22 at 3.15.56 PM.png"
style='width:415pt;height:327pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file://localhost/Users/nwheat/Library/Caches/TemporaryItems/msoclip/0/clip_image007.png"
o:title="Screen Shot 2013-05-22 at 3.15.56 PM.png"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">Invoking the “Backup Dispatcher” workflow,
this interface is asking for the following elements.</span></div>
<div class="MsoListParagraphCxSpFirst" style="mso-list: l1 level1 lfo2; text-indent: -18.0pt;">
<ul>
<li><b style="mso-bidi-font-weight: normal;"><span lang="EN-US">Email address to send the job report</span></b><span lang="EN-US"> – listing
the VMs backed up and the success/failure results.</span></li>
<li><b style="mso-bidi-font-weight: normal;"><span lang="EN-US">Number of backups to retain</span></b><span lang="EN-US"> – on a per
VM basis.<span style="mso-spacerun: yes;"> </span>This could be made a global
property, but we had fun playing around with different levels here.<span style="mso-spacerun: yes;"> </span>I wrote the retention logic to allow for
changes to retention, so that during periods of greater change, more backups
could be safely kept, and then scaled down later.</span></li>
<li><b style="mso-bidi-font-weight: normal;"><span lang="EN-US">Folder containing the VMs to be backed up</span></b><span lang="EN-US"> – the workflow would collect ALL VMs from the selected folder.<span style="mso-spacerun: yes;"> </span>The management of what to backup is then a
simple drag’n’drop of any VMs into or out of this folder.</span></li>
</ul>
</div>
<div class="MsoNormal">
<span lang="EN-US">We provide a few things in the static
properties, such as mail server and content settings, but most other things are
dynamic.<span style="mso-spacerun: yes;"> </span>The static properties are
present as “Workflow Attributes” – these are essentially working (read/write)
variables that don’t act as workflow input (read only) or output (write
only).<span style="mso-spacerun: yes;"> </span>Before running the package, you
will need to have your vCenter Server registered in vCenter Orchestrator, so
that it appears within the vCO inventory and enables communication between the
two. <o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">Below is a screenshot of the inventory, as
viewed from the vCO Client.<span style="mso-spacerun: yes;"> </span>This is one
of the excellent aspects of vCO – I can pre-configure what things are present
in my environment and not have to deal with connection strings, user
credentials, and various properties embedded in scripts.<span style="mso-spacerun: yes;"> </span>It is done just once, and then the workflows
can talk to your datacenter!<span style="mso-spacerun: yes;"> </span>If you
can’t see your vCenter inventory like this in vCenter Orchestrator, the
workflow won’t be able to do much with your environment!<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">In my case, I have easily connected up:</span></div>
<div class="MsoListParagraphCxSpFirst" style="mso-list: l1 level1 lfo2; text-indent: -18.0pt;">
<ul>
<li>2 x vCenter servers</li>
<li>UCS Manager</li>
<li>Active Directory</li>
<li>vCloud Director</li>
<li>vCenter Chargeback</li>
<li>A mail server</li>
</ul>
<!--[if !supportLists]--></div>
<div class="MsoNormal">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7ADvLO_OnU1cazuCA6dpuLfb5__QTjokXrPqmDefVAg19iCoM4kAhF5ubLuBCFbjK4F4ksrdWeWEzZbqMhhhAEHm_MkTbzHV3sObXSzTVwQqSoP-tZLFwplWshM6fxBjRflHvyk3cu8VW/s1600/Screen+Shot+2013-05-22+at+3.14.27+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7ADvLO_OnU1cazuCA6dpuLfb5__QTjokXrPqmDefVAg19iCoM4kAhF5ubLuBCFbjK4F4ksrdWeWEzZbqMhhhAEHm_MkTbzHV3sObXSzTVwQqSoP-tZLFwplWshM6fxBjRflHvyk3cu8VW/s400/Screen+Shot+2013-05-22+at+3.14.27+PM.png" width="190" /></a></div>
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">When clicking on the hyperlink to point the
workflow to a specific folder (initially has the value “<i style="mso-bidi-font-style: normal;">Not set</i>”), the workflow interface presents a view of the vCenter
inventory (as seen by vCO) for you to choose from, as in the screenshot below.<span style="mso-spacerun: yes;"> </span>Again, this is simpler for the workflow user,
because I had already made vCenter available to vCO using a service account
(although I could have forced a per-user connection if I wanted).<o:p></o:p></span></div>
<div class="MsoNormal">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_q3023IQD4k6PKA70SlW2Yp6GvB1GjD4-Hm0z7uSSW0z0_X9_Ph1cvU5A-obrcKdFN-4pxt5J7Zy0xZ9TSvHwwwsIRV0J3UrSK_ouFje8gE1Sp_j9g3RqrJxURIbosh9rIqJ8m1_A1ENa/s1600/Screen+Shot+2013-05-22+at+3.16.20+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="298" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_q3023IQD4k6PKA70SlW2Yp6GvB1GjD4-Hm0z7uSSW0z0_X9_Ph1cvU5A-obrcKdFN-4pxt5J7Zy0xZ9TSvHwwwsIRV0J3UrSK_ouFje8gE1Sp_j9g3RqrJxURIbosh9rIqJ8m1_A1ENa/s400/Screen+Shot+2013-05-22+at+3.16.20+PM.png" width="400" /></a></div>
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">When scheduling the workflow to run on an
automatic daily cycle, you can set this parameter during the scheduling
process, in the same way as shown here.<span style="mso-spacerun: yes;"> </span>In
the case of our customer, they wanted to schedule a collection of these backup
jobs daily, each pointing to slightly different sets of VMs to backup.<span style="mso-spacerun: yes;"> </span>In the vCO Scheduler, each job entry was
provided with the distinct folders that it would manage, and the jobs just ran
thereafter without any real caretaking. <o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">The first action of the Backup Dispatcher
is to “<b style="mso-bidi-font-weight: normal;">Get All Virtual Machines By
Folder Including Sub Folders</b>”.<span style="mso-spacerun: yes;"> </span>This
is pretty self-explanatory, and was an action already available through the
vSphere Plugin shipped with vCO.<span style="mso-spacerun: yes;"> </span>Conveniently,
this requires only the input folder, and returns an array containing all VMs
found. <o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">The next action is to “<b style="mso-bidi-font-weight: normal;">Sort VMs By Name</b>”.<span style="mso-spacerun: yes;"> </span>I
implemented this as a subordinate workflow, while I was toying around with
various ways to solve a key problem – which was how to determine whether the
current backup is to be retained or not.<span style="mso-spacerun: yes;">
</span>I wanted to ensure the workflow didn’t use any hard dates – as it
doesn’t know if it is being run weekly or daily, or ad hoc, and a whole bunch
of other “if’s” and “maybe’s” that came up while I was thinking about it.<span style="mso-spacerun: yes;"> </span>Due to the limited amount of time I wanted to
spend on it, and my rudimentary skills, I decided to name VM backups according
to a certain naming pattern, which contains:</span></div>
<div class="MsoListParagraphCxSpFirst" style="mso-list: l1 level1 lfo2; text-indent: -18.0pt;">
<ul>
<li><span lang="EN-US">Original VM name</span></li>
<li><span lang="EN-US">A known delimiter, which
hopefully won’t pop-up in a normal VM name.<span style="mso-spacerun: yes;">
</span>I chose a colon “:” in my example, after checking with the customer that
they wouldn’t expect a problem.</span></li>
<li><span lang="EN-US">The keyword “<i style="mso-bidi-font-style: normal;">BACKUP</i>”</span></li>
<li><span lang="EN-US">Another delimiter “:”</span></li>
<li><span lang="EN-US">A date/time stamp, in the
format <i style="mso-bidi-font-style: normal;">yyyyMMddhhmm</i>, such as
201306051609 – which is what my clock says as I write this.</span></li>
</ul>
</div>
<div class="MsoNormal">
<span lang="EN-US">This “<b style="mso-bidi-font-weight: normal;">Sort
VMs By Name</b>” action merely contains a Javascript function, made with a
little help from web searching, which sorts VMs according to original name
first, and then from most recent to least recent backup.<span style="mso-spacerun: yes;"> </span>This helps later on, because the retention
policy can skip over the ones to be retained, and delete any subsequent backups
older than these.<span style="mso-spacerun: yes;"> </span>You’ll see that later
in the “<b style="mso-bidi-font-weight: normal;">Process backup and retention
logic</b>” workflow.<span style="mso-spacerun: yes;"> </span>Anyway, the point
being that this particular point in my effort probably took the longest amount
of time as I struggled to remember anything at all about writing some
script.<span style="mso-spacerun: yes;"> </span>It just goes to show how little
I needed to know for the rest of the effort!<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">The next stage of the main workflow is
essentially a “for each” loop.<span style="mso-spacerun: yes;"> </span>I
implemented it as an explicit loop, just because the easy vCO “<b style="mso-bidi-font-weight: normal;">ForEach</b>” logic control worked a little
differently than I wanted it to here – but I could probably tackle this again
in a better way.<span style="mso-spacerun: yes;"> </span>For each of the VMs in
the (now sorted) array, I submit them each to the “<b style="mso-bidi-font-weight: normal;">Process backup and retention logic</b>” subordinate workflow.<span style="mso-spacerun: yes;"> </span>This subordinate workflow will determine
whether or not to backup the VM at hand, and if so, will return an identifier
for the backup activity.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">Once all VMs have been “processed”, the
main workflow then waits for any backup activities that are being performed, using
the workflow identifiers kept from each job submission, and then sends a
report.<span style="mso-spacerun: yes;"> </span>The main framework being used
here was derived from some previous examples created by Joerg Lew. (Well, I
think it was Joerg!)<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">OK, so that’s the main flow, but the cool
bit is doing the live backup from a quiesced snapshot, so let’s look at that - in
a minute.<span style="mso-spacerun: yes;"> </span>First, we need to figure out
what needs backing up.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<h2>
<span lang="EN-US">Process Backup and Retention Logic<o:p></o:p></span></h2>
<div class="MsoNormal">
<span lang="EN-US">In hindsight, this is a crappy name, but
this subordinate workflow is being called for each and every VM that was
discovered, and is trying to determine whether this is a ‘real’ virtual machine
needing backup, or if it’s a backup that might need to be removed.<span style="mso-spacerun: yes;"> </span>This part of the workflow was where I did
most of the thinking, trying different approaches that I could make work using
my rudimentary skills.<o:p></o:p></span></div>
<div class="MsoNormal">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWRTchJK3PEjFtxzrKjUgaeVPGUN6ny2_G1A7yzCl5W-FjmH_d4tIxXZK2BxyKHftF1SuNO5NGQE52rUjnEFDuhyphenhyphen3p5LfwJU6I2Eu34RaNQ05Ey9HrTmIC_vs84MegQf5-LrwMQtFNUb65/s1600/Process+backup+and+retention+logic.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWRTchJK3PEjFtxzrKjUgaeVPGUN6ny2_G1A7yzCl5W-FjmH_d4tIxXZK2BxyKHftF1SuNO5NGQE52rUjnEFDuhyphenhyphen3p5LfwJU6I2Eu34RaNQ05Ey9HrTmIC_vs84MegQf5-LrwMQtFNUb65/s640/Process+backup+and+retention+logic.png" width="474" /></a></div>
<br /></div>
<div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none;">
<a href="http://www.blogger.com/blogger.g?blogID=4265353298939347652" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=4265353298939347652" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=4265353298939347652" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=4265353298939347652" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><span lang="EN-US" style="font-family: Times; mso-bidi-font-family: Times; mso-no-proof: yes;"><!--[if gte vml 1]><v:shape id="Picture_x0020_6"
o:spid="_x0000_i1028" type="#_x0000_t75" style='width:491pt;height:662pt;
visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file://localhost/Users/nwheat/Library/Caches/TemporaryItems/msoclip/0/clip_image013.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US" style="font-family: Times; mso-bidi-font-family: Times;"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">You can also see the passing of inputs and outputs for this workflow, which is an awesome visualisation of where information is flowing. It's also very easy to just click'n'drag this info around, as you're building the workflow.</span><br />
<span lang="EN-US"><br /></span>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyci6aabb0pvr2OEK0Vd3kMz2vrBkmh9GjSoeq8SGKpp98hatcXExcghEBbqMpsOFSpxhDtLBLVxFjpi4Y_yN66eR-pnEkKvP9VGKNi8FYcuQFIthk9ZItw851a2tFT5V19kkWkZMBWeCM/s1600/Screen+Shot+2013-06-06+at+6.35.49+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="290" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyci6aabb0pvr2OEK0Vd3kMz2vrBkmh9GjSoeq8SGKpp98hatcXExcghEBbqMpsOFSpxhDtLBLVxFjpi4Y_yN66eR-pnEkKvP9VGKNi8FYcuQFIthk9ZItw851a2tFT5V19kkWkZMBWeCM/s400/Screen+Shot+2013-06-06+at+6.35.49+AM.png" width="400" /></a></div>
<span lang="EN-US"><br /></span>
<span lang="EN-US"><br /></span>
<span lang="EN-US">Firstly, the workflow tries to separate the
discovered VM name into the three separate elements, according to the “<i style="mso-bidi-font-style: normal;">OriginalVMname:BACKUP:201306051409</i>” type
of format.<span style="mso-spacerun: yes;"> </span>If this is not actually a
backup, the last two elements will just be empty, of course.<span style="mso-spacerun: yes;"> </span>If we find that the current VM is a new name,
then any counters – which were being used to count the number of old backups –
need to be reset to zero.<span style="mso-spacerun: yes;"> </span>Then, if the
VM has the special name “BACKUP” in it, then the workflow only needs to determine
whether to keep it.<span style="mso-spacerun: yes;"> </span><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">These decisions were based on a couple of
simple bits of Javascript logic – but you may notice that all the decisions are
being made with vCO logic elements.<span style="mso-spacerun: yes;"> </span>This
is also another easy part of vCenter Orchestrator – you drop in an “IF” logic
box, give it an input to determine a “true” or “false” choice, and then you
simply drag a connection for each choice to the next part of the workflow.<span style="mso-spacerun: yes;"> </span>Too easy.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">The only smart bits I used in this whole
workflow were:<o:p></o:p></span></div>
<div class="MsoListParagraphCxSpFirst" style="mso-list: l1 level1 lfo2; text-indent: -18.0pt;">
<br />
<ul>
<li><span lang="EN-US">A few Javascript bits of logic,
which I could likely replace with more readable vCO logic elements</span></li>
<li><span lang="EN-US">A call to a vCenter action to “<b style="mso-bidi-font-weight: normal;">Delete Virtual Machine</b>”, if the
workflow has found an old backup requiring deletion.</span></li>
<li><span lang="EN-US">A function call to submit a new
vCO workflow for any VMs found that need backing up.<span style="mso-spacerun: yes;"> </span>This is done in the “<b style="mso-bidi-font-weight: normal;">Backup This VM</b>” script action, and this is what returns the
identifier for the running backup job that is tracked later on.<span style="mso-spacerun: yes;"> </span>The workflow that we actually call is “<b style="mso-bidi-font-weight: normal;">Clone VM For Backup</b>”, which is
described next.</span></li>
</ul>
</div>
<div class="MsoNormal">
<br /></div>
<h2>
<span lang="EN-US">Clone VM For Backup<o:p></o:p></span></h2>
<div class="MsoNormal">
<span lang="EN-US">This is a pretty straightforward bit of
work, which anybody could put together on their Day 2 exploration of vCenter
Orchestrator.<span style="mso-spacerun: yes;"> </span>It simply takes a VM as an
input, and calls the workflows already available in the vSphere Plugin.<o:p></o:p></span><br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHau3qC0N4W32SAoDajNrrWr6e4ta0gqg2tb5rCkny9HBFX1L3pLOermzWiTXLwBv2INbaGP5t4XET_NE2_D588Zcm9C5cQRzxGJQZ4igkStpEcmqHhZ8l14DpNeMMk9wMesSYeSx7XSdk/s1600/Clone+VM+for+Backup.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHau3qC0N4W32SAoDajNrrWr6e4ta0gqg2tb5rCkny9HBFX1L3pLOermzWiTXLwBv2INbaGP5t4XET_NE2_D588Zcm9C5cQRzxGJQZ4igkStpEcmqHhZ8l14DpNeMMk9wMesSYeSx7XSdk/s640/Clone+VM+for+Backup.png" width="640" /></a></div>
<span lang="EN-US"><br /></span></div>
<div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none;">
<span lang="EN-US" style="font-family: Times; mso-bidi-font-family: Times; mso-no-proof: yes;"><!--[if gte vml 1]><v:shape id="Picture_x0020_9"
o:spid="_x0000_i1027" type="#_x0000_t75" style='width:489pt;height:79pt;
visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file://localhost/Users/nwheat/Library/Caches/TemporaryItems/msoclip/0/clip_image015.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US" style="font-family: Times; mso-bidi-font-family: Times;"><o:p></o:p></span></div>
<div class="MsoNormal">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">There is one element that is a little ‘special’
here, which is the “<b style="mso-bidi-font-weight: normal;">Clone From Snapshot</b>”
workflow.<span style="mso-spacerun: yes;"> </span>After creating a snapshot,
which is passed the “<i style="mso-bidi-font-style: normal;">Quiesce=True</i>”
parameter, the next piece is to clone the still-running VM from that
snapshot.<span style="mso-spacerun: yes;"> </span>This workflow was taken from
Joerg Lew from his years-old blog on this topic.<span style="mso-spacerun: yes;"> </span>This is a native capability of vSphere, and
the vSphere API, but just isn’t readily exposed through other means such as the
vSphere Client.<span style="mso-spacerun: yes;"> </span><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">This workflow is also passed the parameter
to make the new clone into a template, which helps avoid accidental power-on
operations.<span style="mso-spacerun: yes;"> </span>The new template is named
according to the “<i style="mso-bidi-font-style: normal;">OriginalVMname:BACKUP:yyyMMddhhmm</i>”
format mentioned earlier.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">The quiescing behaviour called during the
snapshot action is the native vSphere capability to invoke VSS for Windows
machines, or look for scripting stubs in Linux machines.<span style="mso-spacerun: yes;"> </span>It is then up to an application owner to
determine if any special actions might be needed to ensure application
consistency.<span style="mso-spacerun: yes;"> </span>Whatever the owner decides,
the workflow doesn’t need to worry about it.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">The other “cool” thing I decided would make
sense is to “<b style="mso-bidi-font-weight: normal;">Remove All Snapshots</b>”
once the clone has finished.<span style="mso-spacerun: yes;"> </span>This was a
clear decision that I thought would have the added benefit of ensuring
snapshots disappeared on a regular basis.<span style="mso-spacerun: yes;">
</span>I have fielded enough urgent calls from customers who have killed their
environment because of snapshots filling up datastores. If this was deemed
undesirable, however, the workflow could be modified to only remove the
snapshot that was created in the prior step, using the available “<b style="mso-bidi-font-weight: normal;">Remove Snapshot</b>” workflow instead.<span style="mso-spacerun: yes;"> </span>The risk here is that something unexpected
might prevent this clean up from happening one day, and the snapshot would be
effectively “forgotten”.<span style="mso-spacerun: yes;"> </span>Hence, my
decision to remove all snapshots provides a nice safeguard.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<h2>
<span lang="EN-US">Results<o:p></o:p></span></h2>
<div class="MsoNormal">
<span lang="EN-US">At the end of the process, I can look at
the results of running this workflow in the environment.<span style="mso-spacerun: yes;"> </span>Below is a view of the job mid-flight in a
demo environment.<o:p></o:p></span></div>
<div class="MsoNormal">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK_XqGnJ1I6dH05NCzFC1Slqb1exbEZTdjdzPSELkJeKFpqOLmCNuXlD5U95KYvlda_A0SXQVfYt_-IDaxL0iUwsKEjRKEvbmOUpQ1IjXBRSZHzjySzgnZTmRoeG_DJ7WiFUhiHsPStInB/s1600/Screen+Shot+2013-05-22+at+3.18.16+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK_XqGnJ1I6dH05NCzFC1Slqb1exbEZTdjdzPSELkJeKFpqOLmCNuXlD5U95KYvlda_A0SXQVfYt_-IDaxL0iUwsKEjRKEvbmOUpQ1IjXBRSZHzjySzgnZTmRoeG_DJ7WiFUhiHsPStInB/s400/Screen+Shot+2013-05-22+at+3.18.16+PM.png" width="400" /></a></div>
</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">You can just see that the “Moodle” VM is
still being cloned and hasn’t yet been turned into a template.<span style="mso-spacerun: yes;"> </span>You can see, however, the other templates
from earlier backups having finished – in the current schedule, and also an
earlier call.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">I put in a certain amount of logging in the
vCO workflows, writing to the <b style="mso-bidi-font-weight: normal;">Server.log(“__“)</b>
very handy function call, such as the example below.<o:p></o:p></span></div>
<div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none;">
<i style="mso-bidi-font-style: normal;"><span lang="EN-US"><span style="mso-tab-count: 1;"> </span></span></i><i style="mso-bidi-font-style: normal;"><span lang="EN-US" style="font-family: Times; mso-bidi-font-family: Times;">Server.log("Submitting
backup for: " + vm.name);<o:p></o:p></span></i></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">I have included the logging output below,
to give you an idea of what this creates.<o:p></o:p></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi2EwXlI-DQ_EQfZUJk8cP56DBRn2hMAToa3sFrxmsR8W5_R11eDY6wVMUNV4M8UAehGa1hMU1p1P41UmkCav79AK67mPUku2vTB5BXzuz0UlpaePhy5GKjGNY40G5wW3ZXJhXmWoFJ_r0/s1600/Screen+Shot+2013-05-22+at+11.44.59+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi2EwXlI-DQ_EQfZUJk8cP56DBRn2hMAToa3sFrxmsR8W5_R11eDY6wVMUNV4M8UAehGa1hMU1p1P41UmkCav79AK67mPUku2vTB5BXzuz0UlpaePhy5GKjGNY40G5wW3ZXJhXmWoFJ_r0/s400/Screen+Shot+2013-05-22+at+11.44.59+AM.png" width="400" /></a></div>
</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">This solution took only a few days of
playing, experimenting and learning.<span style="mso-spacerun: yes;"> </span>A
lot of the vCenter Orchestrator functionality is self-evident, or if not, it is
very comprehensively documented.<span style="mso-spacerun: yes;"> </span>The
customer was very pleased with this simple approach to solving a simple
problem, and we trod a fine line between simplicity and complexity, to ensure
the customer could easily understand the results and own it without too much
hassle.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">I am certainly not suggesting that this is
a great backup strategy for your organisation, and that isn’t really the point
of sharing it here.<span style="mso-spacerun: yes;"> </span>I have used this
example of a quick and cheap solution to illuminate one way we have used
vCenter Orchestrator.<span style="mso-spacerun: yes;"> </span>There are many
other use cases that I’m sure you will find, once you discover how excellent this
tool is, that you probably already possess.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">As I pointed out at the start of this
article, technical architects can get carried away with orchestration, and many
organisations build very complex systems using this approach.<span style="mso-spacerun: yes;"> </span>The temptation is certainly there.<span style="mso-spacerun: yes;"> </span>However, it is very sensitive to change.<span style="mso-spacerun: yes;"> </span>The simple example here might be robust
enough, because it is only talking to one element – vSphere.<span style="mso-spacerun: yes;"> </span>But this would quickly become an unmanageable
beast if we connected to a server platform, a storage platform, a network
manager and a firewall system – just for example.<span style="mso-spacerun: yes;"> </span>Each element either becomes frozen in time,
or else creates a risk of breaking the orchestration workflows.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">The abstraction delivered by virtualization
solutions such as vCloud Director, and vCenter itself, introduces standardised,
software-based interfaces to the datacenter.<span style="mso-spacerun: yes;">
</span>Actions can then be controlled through these software interfaces by the
tools’ native functions and policies.<span style="mso-spacerun: yes;">
</span>This is the true value of the broader Software Defined Datacenter
architecture.<span style="mso-spacerun: yes;"> </span>For the large, complex
enterprise, orchestration is still useful and necessary “glue” from time to
time, and vCenter Orchestrator is a very powerful and friendly tool in this
capacity.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<h2>
<span lang="EN-US">Further Areas For Expansion<o:p></o:p></span></h2>
<div class="MsoNormal">
<span lang="EN-US">Thanks to Joerg Lew and Peter Marfatia for
their contributions to putting this little solution together.<span style="mso-spacerun: yes;"> </span>I also greatly appreciate the community
leadership provided by Christophe Decanini and Burke Azbill, who contributed
plenty of knowledge and examples on the web for me to follow.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<a href="http://www.blogger.com/blogger.g?blogID=4265353298939347652" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=4265353298939347652" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=4265353298939347652" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=4265353298939347652" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><span lang="EN-US">The example given here is a quick run at a
solution, and certainly has plenty of opportunities for improvement.<span style="mso-spacerun: yes;"> </span>With additional time, I would probably
replace some Javascript functions with vCenter Orchestrator logic elements,
which would make the workflow easier to understand visually, and make the
self-documentation more complete.<span style="mso-spacerun: yes;"> </span>I
would also re-visit the explicit loop I have used here, and find an elegant way
to make use of the “ForEach” construct instead.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<h2>
<span lang="EN-US">Resources<o:p></o:p></span></h2>
<div class="MsoNormal">
<span lang="EN-US">There are a bunch of resources that I have
used over time, and that really help with getting an introduction to vCenter
Orchestrator.<span style="mso-spacerun: yes;"> </span>A couple of them are
listed below, to start you on your way.</span></div>
<div class="MsoListParagraphCxSpFirst" style="mso-list: l1 level1 lfo2; text-indent: -18.0pt;">
<br />
<ul>
<li><span lang="EN-US"><a href="http://www.vcoteam.info/">http://www.vcoteam.info/</a> - First and
foremost, this site is fantastic, and maintained by very enthusiastic
Orchestrator experts.<span style="mso-spacerun: yes;"> </span>Start here.</span></li>
<li><span lang="EN-US"><a href="http://www.vcoportal.de/2011/08/clone-from-old-snapshot/">http://www.vcoportal.de/2011/08/clone-from-old-snapshot/</a>
- This is the snapshot workflow package I leveraged to build this
solution.<span style="mso-spacerun: yes;"> </span>Thanks Joerg!</span></li>
<li><span lang="EN-US"><a href="https://blogs.vmware.com/orchestrator/">https://blogs.vmware.com/orchestrator/</a>
- The VMware Blog site is full of interesting news and posts, so worth a good
trawling every now and then.</span></li>
</ul>
<!--[if !supportLists]--></div>
<!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]--><!--[if gte mso 9]><xml>
<o:DocumentProperties>
<o:Revision>0</o:Revision>
<o:TotalTime>0</o:TotalTime>
<o:Pages>1</o:Pages>
<o:Words>2746</o:Words>
<o:Characters>15657</o:Characters>
<o:Company>VMware</o:Company>
<o:Lines>130</o:Lines>
<o:Paragraphs>36</o:Paragraphs>
<o:CharactersWithSpaces>18367</o:CharactersWithSpaces>
<o:Version>14.0</o:Version>
</o:DocumentProperties>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]-->
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves>false</w:TrackMoves>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>JA</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
<w:UseFELayout/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="276">
<w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]-->
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:Cambria;
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;
mso-ansi-language:EN-US;}
</style>
<![endif]-->
<!--StartFragment-->
<!--EndFragment--><br />
<div class="MsoNormal">
I have also uploaded my vCenter Orchestrator package and documentation at the links below. Please feel free to use and abuse - and if you make it bugger and better, please share!<br />
<br />
<ul>
<li>vCenter Orchestrator - <a href="https://dl.dropboxusercontent.com/u/410045/com.vmware.coe.snapshot2clone4backup.package" target="_blank">Simple Snapshot Backup package</a></li>
<li>Auto-generated <a href="https://dl.dropboxusercontent.com/u/410045/BackupDocumentation.zip" target="_blank">documentation</a>.</li>
</ul>
Thanks for reading!</div>
Nathan Wheathttp://www.blogger.com/profile/16568216079224543463noreply@blogger.com1tag:blogger.com,1999:blog-4265353298939347652.post-24000048564733166252013-05-13T14:06:00.003+10:002013-05-13T14:39:47.876+10:00Showing Back IT Costs to the Business - A Simple Cost Model for IaaS<!--[if gte mso 9]><xml>
<o:DocumentProperties>
<o:Revision>0</o:Revision>
<o:TotalTime>0</o:TotalTime>
<o:Pages>1</o:Pages>
<o:Words>322</o:Words>
<o:Characters>1842</o:Characters>
<o:Company>VMware</o:Company>
<o:Lines>15</o:Lines>
<o:Paragraphs>4</o:Paragraphs>
<o:CharactersWithSpaces>2160</o:CharactersWithSpaces>
<o:Version>14.0</o:Version>
</o:DocumentProperties>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]-->
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>JA</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
<w:UseFELayout/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="276">
<w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]-->
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:Cambria;
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;
mso-ansi-language:EN-US;}
</style>
<![endif]-->
<!--StartFragment-->
<br />
<h2>
<span lang="EN-US">Introduction</span></h2>
<div class="MsoNormal">
<span lang="EN-US">Let’s get it clear up front – I’ve only
ever found two customers who actually have the ability (or interest) to
“chargeback” IT costs to their business groups.
But, speaking in my role as a VMware techo, almost all customers are
very interested to know how they can communicate IT costs to the rest of the
business. The problem is that this is not
really something tackled by most IT groups, and it can be difficult to start,
so I thought I’d share some thoughts, which have been helpful in my discussions
so far.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">The two questions most organisations seem
to want answered is: "Where did the money go?" And: "Who’s using all our stuff?" This
becomes so much more of a problem when establishing a shared virtual platform,
and especially when talking about the path to a Private Cloud (or self-service)
shared capability. <o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">Perhaps you spent $100k on extra storage,
and now it’s almost disappeared – but where?
Who has it? Or perhaps you want
to show real data to highlight the challenge that Project A is using up a ton
of your IT capacity, and that is why you need to buy some more servers, or
memory upgrades. The reason for knowing
this is that IT is usually begging for money, and the business can begrudge
spending extra when it is hard to show why.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">I love this quote from “<a href="http://books.google.com.au/books/about/The_new_CIO_leader.html?id=VcbS2vNzt_4C" target="_blank">The New CIO Leader</a>”<o:p></o:p></span></div>
<div class="MsoNormal" style="margin-left: 36.0pt;">
<b><i><span lang="EN-US">“Treated
as overhead and often lacking even the most rudimentary chargeback systems, IT
appears to be free and therefore without much value. Lacking a price point to encourage
responsible decision making, business leaders demand more service than they
fund, creating a perpetual backlog of demand and placing IS in the position of
continually saying no.”</span></i></b><o:p></o:p></div>
<div align="right" class="MsoNormal" style="margin-left: 36.0pt; text-align: right;">
<b><span lang="EN-US">The New CIO Leader</span></b><o:p></o:p></div>
<div align="right" class="MsoNormal" style="margin-left: 36.0pt; text-align: right;">
<b><span lang="EN-US">Dr Marianne Broadbent & Dr Ellen Kitzis</span></b><o:p></o:p></div>
<div align="right" class="MsoNormal" style="margin-left: 36.0pt; text-align: right;">
<b><span lang="EN-US">Harvard Business Press, 2004</span></b><o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">In other words, IT keeps costing more
money. It looks like a burden, even if
it is critical to the business. And on
the other hand, IT kind of appears to be “Free” (like beer), so why can’t I ask
for 16 CPUs and 64GB memory in my new SQL database? After all, we now have a
shared, pooled platform (thanks VMware!), so there is always a little spare
capacity, and no reason I can’t have some, right? Sound familiar?</span></div>
<div class="MsoNormal">
<span lang="EN-US"><br /></span></div>
<h2>
<span lang="EN-US">What Does IT Cost?</span></h2>
<div class="MsoNormal">
<span lang="EN-US">It can be hard to draw the line on what you
include under your cost models. I think it is
useful to start with technical resources – such as servers, licenses, storage
and that sort of thing. So other than
staff, make a list of EVERYTHING that is involved in delivering a business
application, and then we’ll find a way to allocate these costs to a metric,
such as a VM hourly charge. Having said
that, don’t go crazy and turn this into an exercise for the Accounting
Department just yet – keep it simple so you can get started. Then you can refine.</span></div>
<div class="MsoNormal">
<span lang="EN-US"><b><br class="Apple-interchange-newline" />CAVEAT</b>: I have used Hourly costs throughout my example here, because I am building a model that can be easily plugged into vCenter Chargeback Manager’s hourly</span> consumption metering. If you would rather use a monthly/daily basis, then adjust accordingly.<br />
<br /></div>
<h2>
<span lang="EN-US">A Simple/Starter Example</span></h2>
<h3>
<span lang="EN-US">Step 1 – Find your costs</span></h3>
<div class="MsoNormal">
<span lang="EN-US">A simple list to start with might look
like the following.</span><span lang="EN-US" style="font-family: Symbol; text-indent: -18pt;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span></div>
<div class="MsoNormal">
</div>
<ul>
<li><span style="text-indent: -18pt;">Physical servers</span></li>
<li><span style="text-indent: -18pt;">Network/storage switches</span></li>
<li><span style="text-indent: -18pt;">Firewalls and other
networking/security devices</span></li>
<li><span style="text-indent: -18pt;">Storage controllers and disks</span></li>
<li><span style="text-indent: -18pt;">Software licenses</span></li>
<li><span style="text-indent: -18pt;">Rack space, power and cooling</span> </li>
</ul>
<h3>
<span lang="EN-US">Step 2 – When does it cost?</span></h3>
<div class="MsoNormal">
<span lang="EN-US">This is important – you need to know what
makes your incur these costs. Let’s take
physical servers as a good example to start with. The core question to ask is “What event or
resource causes me to buy another server?”
For most customers, the answer is memory consumption. When I look across recent deployments, CPU
capacity seems to be in plentiful supply, and memory is still the most
constrained resource. So in most cases,
a project asking for 16GB memory is going to tip me over into a new server
purchase, rather than the 4, 8, or 16 vCPUs that came with the request.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">Your environment might be different, but
the process will be similar.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">Perhaps a physical server costs $20,000,
including hardware maintenance over its planned life. And perhaps this server has 96GB memory
installed in it. So on a resource basis:</span><span lang="EN-US" style="font-family: Symbol; text-indent: -18pt;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span></div>
<div class="MsoNormal">
</div>
<ul>
<li><span style="text-indent: -18pt;">Cost of server: $20,000</span></li>
<li><span style="text-indent: -18pt;">Memory capacity: 96GB (the most constrained resource)</span></li>
<li><span style="text-indent: -18pt;">Upfront cost per GB: $20,000/96GB
= $208.33 per GB. </span> </li>
</ul>
<br />
<div class="MsoNormal">
<span lang="EN-US">That’s an upfront purchase cost – but some
VMs live for 4 months, others for 8 years, so how does this figure? The answer is to have a time-based rate, such as an Hourly cost, applied against the life of the equipment.</span></div>
<div class="MsoNormal">
<span lang="EN-US"><br /></span></div>
<h3>
<span lang="EN-US">Step 3 – How long does it last?</span></h3>
<div class="MsoNormal">
<span lang="EN-US">This is often missed – when will you buy a
replacement for this component? I spoke
to a customer last year who charged projects per GB of storage, but only once,
ever. That meant that IT was responsible
for the entire cost of a SAN refresh – not a pretty overhead, and again IT just
looked like a dead weight every few years.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">Going back to our physical server example,
perhaps you plan to refresh your servers every 3 years. That means the costs should be spread over
that 3 year life, as below. Don’t forget
leap-years!</span></div>
<div class="MsoNormal">
</div>
<ul>
<li>Cost of server: $20,000</li>
<li>Memory capacity: 96GB (the most constrained resource)</li>
<li>Life of server: 3 years
(1,095.75 days, or 26,298 hours!)</li>
<li>Hourly cost per GB: $20,000 / 96GB / 3
years = $0.007922/GB/hour. </li>
</ul>
<div class="MsoNormal">
<span lang="EN-US">Fantastic! Now there’s an hourly rate for
the cost of a physical server to support a VM using a memory consumption
model! At least, it’s something to start
with. How accurate is it? Well, let’s work on that.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<h3>
<span lang="EN-US">Step 4 – Refining the model</span></h3>
<div class="MsoNormal">
<span lang="EN-US">The reality is that cost models can get as complicated as you can tolerate. Again,
don’t go nuts, as usually the main goal here is to find out a relative measure
of who is using what amount of resources, and a rough cost impact. But let’s consider a few more things in our
simple model.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">In a VMware vSphere environment, there will
be clusters of hosts, and very often in an “N+1” availability
configuration. That is, the resource
consumption should go only so high as still being able to tolerate one host
being down without impacting performance.
Also, we tend not to absolutely fill a server before considering it
“full”. Lastly, VMware resource
management is pretty awesome, allowing safe over-commitment, and we can eke out
much more resources than just the raw consumption or allocation we assume up-front.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">These considerations so far boil down to a
net impact on actual memory capacity of a server. Instead of 96GB being “available”, we modify
it as below.</span></div>
<div class="MsoNormal">
</div>
<ul>
<li>Raw physical server capacity:
96GB</li>
<li>Clustering: 10 hosts (9 + 1,
for High Availability)</li>
<li>Level of “fullness”: 85%</li>
<li>Degree of over-commitment: 20%</li>
<li>Adjusted memory capacity: 96GB
* (9/10) * 85% * 120% = 88GB</li>
</ul>
<ul>
<li>Adjusted hourly cost per GB: $20,000/88GB/3
years = $0.008642/GB/hour. </li>
</ul>
I raised an important consideration above, which is "consumption or allocation". To some degree this depends a little on whether you are trying to account for used resources (consumption) or requested resources (allocation). You will need to make some assumptions in either case. But for internal cost reporting (as opposed to chargeback) I find consumption to be a more accurate representation of "where stuff goes".<br />
<br />
<!--[if gte mso 9]><xml>
<o:DocumentProperties>
<o:Revision>0</o:Revision>
<o:TotalTime>0</o:TotalTime>
<o:Pages>1</o:Pages>
<o:Words>512</o:Words>
<o:Characters>2923</o:Characters>
<o:Company>VMware</o:Company>
<o:Lines>24</o:Lines>
<o:Paragraphs>6</o:Paragraphs>
<o:CharactersWithSpaces>3429</o:CharactersWithSpaces>
<o:Version>14.0</o:Version>
</o:DocumentProperties>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]-->
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>JA</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
<w:UseFELayout/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="276">
<w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]-->
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:Cambria;
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;
mso-ansi-language:EN-US;}
</style>
<![endif]-->
<!--StartFragment-->
<br />
<h3>
<span lang="EN-US">Step 5 – Expanding to other costs</span></h3>
<div class="MsoNormal">
<span lang="EN-US">So, now do you just rinse and repeat for all
the other costs? Well, actually not for
that many. A good number of the “other”
costs will also roll into the cost of a physical server. How so?
I’m glad you asked – let’s look at some examples below.</span></div>
<div class="MsoNormal">
</div>
<ul>
<li>VMware licensing for vSphere or
vCloud Suite</li>
<ul>
<li>Per physical CPU, usually 2 or
4 CPUs/licenses per server.</li>
<li>The “life span” of a perpetual
software license is tricky to account for.
You may elect to recover the cost of the license over 3 years, even
though you won’t be re-buying the license when you refresh the server. Annual Support and Subscription (or Software
Assurance for Windows) has no such complications.</li>
</ul>
<li>Microsoft Windows Server licensing</li>
<ul>
<li>If you’re smart, you’ll be
using Datacenter Edition licensing, which is also per physical CPU</li>
</ul>
<li>Blade chassis</li>
<ul>
<li>Will be an added cost to spread
over the blade servers that it supports, which may be 8 servers perhaps.</li>
<li>However, a chassis may survive
6 years, or 2 server refreshes, so we need to take that into account.</li>
</ul>
<li>Network switches</li>
<ul>
<li>Purchases usually tied to ports
being populated, rather than bandwidth.
Again, we can equate this to a per server charge to some degree.</li>
<li>Let’s assume 48 ports. Perhaps 6 ports per server (a false example
if using blade servers, of course). That
breaks down to the cost of one switch per 8 servers, for example.</li>
<li>The same theory could apply to Fibre
Channel switches for storage, if FC based.</li>
<li>Switches will probably be
refreshed on a different cycle, as per the blade chassis above, so again needs
to be considered.</li>
</ul>
<li>Rack space, power and cooling</li>
<ul>
<li>Again, this can be tied to
physical equipment, although it will be a rough estimate.</li>
</ul>
</ul>
<div class="MsoNormal">
If I add these all together using some
rough numbers out of thin air, I get to $0.023167 per GB of virtual machine
memory per hour. It is interesting that this is nearly 3 times the raw server cost, but this single rate is now able to account for servers, platform licensing, switches and datacentre costs.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
I can likewise apply this type of approach
to the remaining components from our short list above. Storage per GB is easy enough, but perhaps
the reason for buying another shelf of disk is actually I/O performance – some
thought is needed to account for IOPS versus space.
You can probably generalize across the environment as a whole to
determine the most obvious metric to use, and treat exceptional workloads as
just that – exceptions. </div>
<div class="MsoNormal">
<br /></div>
<h2>
<span lang="EN-US">Keeping It Simple</span></h2>
<div class="MsoNormal">
<span lang="EN-US">Firewalls and security services are
interesting examples of complexity. The tipping point for expanding a
firewall/IDS to the next bigger model, or another node, is probably network
throughput or perhaps the number of rules processed. You can either meter the network I/O of VMs
to account for these, or perhaps assume an average of 6 rules per VM and meter
on that basis. <o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">By the time we’re digging around at this
level, however, we’re really tweaking a much more detailed model. The overall accuracy of the model is only going to change in small increments. There needs to be a decision about how far
down this path you progress. The overall
goal is to get a rough idea of cost allocation.
Accurately accounting for absolutely all costs is an exercise for
another article, as this would incorporate non-technical costs such as staff
labour, facilities, and maintenance activities, for example.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">The model above has boiled down to a few
simple rates, which you can plug in to vCenter Chargeback Manager, as per the
below screenshot. You now have a method
of finding out where your costs have gone, after buying all your new shiny
servers and disks, and who in your organization is consuming how much
infrastructure.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggmjWVvi5mpSqcDat_QL85zL67CgCNHIRC5VTkb7c_jKhFUap_TwInnqzTaxt0q35P_wMMGJQp78xfCBZ2qVSqmzs_Vv7wgR39xGeNlIIoofrOEwnyrx2VXvl1ZlXNUgjbXFvV8qTR3YVj/s1600/Chargeback+rates.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggmjWVvi5mpSqcDat_QL85zL67CgCNHIRC5VTkb7c_jKhFUap_TwInnqzTaxt0q35P_wMMGJQp78xfCBZ2qVSqmzs_Vv7wgR39xGeNlIIoofrOEwnyrx2VXvl1ZlXNUgjbXFvV8qTR3YVj/s1600/Chargeback+rates.jpg" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">
<!--[if gte mso 9]><xml>
<o:DocumentProperties>
<o:Revision>0</o:Revision>
<o:TotalTime>0</o:TotalTime>
<o:Pages>1</o:Pages>
<o:Words>234</o:Words>
<o:Characters>1334</o:Characters>
<o:Company>VMware</o:Company>
<o:Lines>11</o:Lines>
<o:Paragraphs>3</o:Paragraphs>
<o:CharactersWithSpaces>1565</o:CharactersWithSpaces>
<o:Version>14.0</o:Version>
</o:DocumentProperties>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]-->
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>JA</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
<w:UseFELayout/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="276">
<w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]-->
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:Cambria;
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;
mso-ansi-language:EN-US;}
</style>
<![endif]-->
<!--StartFragment-->
</span></div>
<h2>
<span lang="EN-US">Driving Behaviour<o:p></o:p></span></h2>
<div class="MsoNormal">
<span lang="EN-US">One of the strong motivators to introduce
cost reporting to a business is to help the business understand the
consequences of their IT requests. The
model above merely accounts for resources are they are likely to be
consumed - again going back to the question of consumption versus allocation. A savvy business user
might notice that CPU allocation and usage are not charged at all. So we come back to the earlier question
posed – why shouldn’t Project A ask for 16 CPUs for all their virtual machines?<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">On a technical level, we know that
uncontrolled over-allocation of vCPUs will start to cause poor performance,
from CPU Ready Time particularly. While
the example model I’ve given here is probably enough for cost recovery, there is reason to
include a metric to encourage good behavior – such as splitting costs between
memory consumption and vCPU allocation.
This will help the IT Department have a fact-based conversation with
Project A about reducing its current allocation of CPUs, or asking for less in the
first place. Exactly how you split the
cost, or if perhaps it is an overlay/additional cost, is up to each organization to
decide. This ties into a future discussion
of reporting on Cost Reporting, as we’ve done here, and Charging Back costs to
the business groups. That is a different
topic, as we must consider “cost perception” as well as cost allocation.</span></div>
<div class="MsoNormal">
<span lang="EN-US"><br /></span></div>
<h2>
<span lang="EN-US">Further Areas For Expansion<o:p></o:p></span></h2>
<div class="MsoNormal">
<span lang="EN-US">This article is long enough already. So some areas that are left to future
write-ups could include:</span></div>
<div class="MsoNormal">
</div>
<ul>
<li>Cost Reporting reporting
versus Charging Back to business groups</li>
<li>Accounting for the entire IT
budget, beyond the technical resources</li>
</ul>
<div>
Have any other thoughts? Or perhaps you disagree with my approach here? Please let me know and write a comment below!</div>
<br />
<!--EndFragment--><br />
<!--EndFragment-->
<!--EndFragment--><br />
<!--EndFragment-->Nathan Wheathttp://www.blogger.com/profile/16568216079224543463noreply@blogger.com2