Update ServiceNow CMDB As Part Of IaaS Machine Life Cycle

In a previous post I explained how to update a CMDB as part of IaaS machine lifecycle. The example I used was a generic MSSQL Server table. In this blog post I want to give a more concrete example, namely ServiceNow.

The use case, as I have built it, is using vCO and the REST API’s of ServiceNow and is doing the following: When the machine is requested and provisioned from vCAC portal by the user: A Configuration Item (CI) record is automatically and immediately created in ServiceNow CMDB with the machine attributes coming from vRealize Automation (VM name, IP, CPU Count etc…) The Configuration Item “State” property in ServiceNow CMDB is shown as “On” since the machine exist and is of course running. When the machine is destroyed from the vRealize Automation portal by the user: The same previously created CMDB CI record is not deleted but instead its “State” property is now updated to say “Retired” instead of the previously “On” state. This way, we still have a record of the deleted machine in the CMDB while the “State” property is telling us if the machine exist or not.

Steps needed:

1. In vCO add your ServiceNow host as a REST HTTP Host, for example:

vco7

2. Add 2 REST operations:

-A POST one for CreateVM in CMDB: /api/now/table/cmdb_ci_vm_instance?JSON=&sysparm_action=insert

-A PUT one for UpdateCIBysysid in CMDB: /api/now/v1/table/cmdb_ci_vm_instance/{sys_id}

The result in vCO inventory should look as follows:

vco8

3. Decide which properties you want to send from vRealize Automation to ServiceNow CMDB as CI attributes. In my workflow I am sending a combination of both OOTB properties like “VirtualMachine.Memory.Size” and custom ones I have attached to the IaaS bluepring like “cost” for example or “location”.

The first scriptable task in the vCO workflow needs to reflect what you want to send to ServiceNow for example:

var hostName = vmentity.getProperty(“VirtualMachineName”);

var vmProps = vmentity.getLink(vcacHost,”VirtualMachineProperties”);

for each (var prop in vmProps) {
var propertyName = prop.getProperty(“PropertyName”);
var propertyValue = prop.getProperty(“PropertyValue”);
if (propertyName == “VirtualMachine.CPU.Count”) {
var cpuTotalCount = propertyValue;
}
if (propertyName == “VirtualMachine.Memory.Size”) {
var memoryTotalSize = propertyValue;
}
if (propertyName == “VirtualMachine.Disk0.Size”) {
var diskTotalSize = propertyValue;
}
if (propertyName == “VirtualMachine.Admin.UUID”) {
var uuid = propertyValue;
}
if (propertyName == “VirtualMachine.Network0.Address”) {
var ip = propertyValue;
}
if (propertyName == “__Legacy.Workflow.User”) {
var owner = propertyValue;
}
if (propertyName == “VirtualMachine.Network0.DnsSuffix”) {
var dns = propertyValue;
}
if (propertyName == “cost”) {
var daily_cost = propertyValue;
}
if (propertyName == “VirtualMachine.Network0.MacAddress”) {
var mac = propertyValue;
}
if (propertyName == “location”) {
var location = propertyValue;
}
}

Note: “vmentity” is input parameter of type “vCAC:Entity” coming dynamically from vRealize Automation during provisioning. “vcacHost” on the other hand we set in advance to point to our vRealize Automation server (previously known as vCAC).

Clarifications:

1. Create VMware VM Instance CI – Uses this POST Rest call:

https://<your_snow_server>//api/now/table/cmdb_ci_vmware_instance?JSON=&sysparm_action=insert

2. Update VMwareVM Instance CI by sys_id- Uses this PUT Rest call:

https://<your_snow_server>/api/now/v1/table/cmdb_ci_vm_instance/{sys_id}

You will notice the POST and the PUT REST operations use different cmdb tables in SNOW (cmdb_ci_vm_instance and cmdb_ci_vmware_instance) but for me that didn’t create any issue, it worked well this way. In the POST/insert workflow I grab the sys_id from the CI to be stored in vRealize Automation as a custom property on the blueprint so that when I destroy the VM in vRealize Automation it knows which CI to update in SNOW with the status “Retired”. So make sure you have attached/defined a custom property called “sys_id” to the relevant vRealize Automation IaaS blueprint.

Now we need to associate these 2 workflows with a vCAC external Stub. More information about vCAC external stubs and how they can be associated with vCO workflows and triggered at runtime can be found here in Chris Alleaume’s excellentt blog: Chris’s Blog

Make sure you associate your “Create_VMware_VM_Instance_CI” workflow with MachineProvisioned stub and  “Update_VMwareVM_Instance_CI_by_sys_id_(1)” workflow with MachineDisposing stub as described in Chris’s blog.

So now in ServiceNow when a machine is requested and provisioned from the vRealize Automation Portal, a new CI is created with the “On” state:

vco10

And when the same machine is deleted from the vRealize Automation portal, the State is now set to “Retired”:

vc013

Job Done.

Here are the workflows attached:

http://tinyurl.com/mpz5bho

Advertisements

, , , , , , ,

  1. #1 by Mike Sharpton on June 22, 2015 - 12:28 pm

    Hello, cool stuff here, we want to do something like this. I downloaded your workflows, but I noticed the embedded workflows are not a part of your download, or perhaps I missed it. Do you have these workflows available still? Create VM in CMDB 3, and Update CI by sys_id?

    • #2 by cloudonsteroids on June 22, 2015 - 12:31 pm

      Mike, can you please tell me which workflows are missing and I will send them over? When you validate the wf what missing wf they complain about?

      • #3 by Mike Sharpton on June 22, 2015 - 2:23 pm

        Sorry, I posted to the main comments. My bad. The names are in my post. Create VM in CMDB 3, and Update CI by sys_id

  2. #4 by Mike Sharpton on June 22, 2015 - 2:22 pm

    Hello, the names are in my post. Create VM in CMDB3, and Update CI by sys_id. Thanks!

    • #5 by cloudonsteroids on June 22, 2015 - 2:52 pm

      You can download the entire package from here: http://tinyurl.com/q5jo2e4
      Once you import the package into your vCO client you will see the two missing workflows

      • #6 by Mike Sharpton on June 22, 2015 - 3:55 pm

        Looks good, thanks!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: