使用 vRealize Orchestrator 托管的工作流,可以将 Cloud Assembly 与 ServiceNow 集成以实现 ITSM 合规性
企业用户通常将其云计算管理平台与 IT 服务管理 (IT Service Management, ITSM) 和配置管理数据库 (Configuration Management Database, CMDB) 平台集成以实现合规性。按照此示例,可以使用
vRealize Orchestrator 托管的工作流将
Cloud Assembly 与适用于 CMDB 和 ITSM 的 ServiceNow 集成。使用
vRealize Orchestrator 集成和工作流时,如果您有多个用于不同环境的实例,则功能标记特别有用。有关功能标记的详细信息,请参见
在 Cloud Assembly 中使用功能标记。
在此示例中,ServiceNow 集成由三个顶级工作流组成。每个工作流都有自己的订阅,以便您可以单独更新和迭代每个组件。
- 事件订阅入口点 - 基本日志记录,标识请求用户和 vCenter VM(如果适用)。
- 集成工作流 - 分离对象并将输入传递到技术工作流,处理日志记录、属性和输出更新。
- 技术工作流 - 下游系统集成,供 ServiceNow API 用于创建具有负载和其他虚拟机属性的 CMDB CI、CR 和 Cloud Assembly IaaS API。
过程
- 在 vRealize Orchestrator 中创建并保存包含多个工作流中常用配置的配置文件。
- 将 Cloud Assembly API 令牌保存到与步骤 1 中的配置文件相同的位置。
注:
Cloud Assembly API 令牌会过期。
- 使用提供的脚本元素在 vRealize Orchestrator 中创建工作流。此脚本将引用并查找 REST 主机。此脚本还将使用令牌可选参数的 REST 操作标准化,该参数添加为额外的授权标头。
var configPath = "CS"
var configName = "environmentConfig"
var attributeName = "CASRestHost"
//get REST Host from configuration element
var restHost = System.getModule("au.com.cs.example").getRestHostFromConfig(configPath,configName,attributeName)
var ConfigurationElement = System.getModule("au.com.cs.example").getConfigurationElementByName(configName,configPath);
System.debug("ConfigurationElement:" + ConfigurationElement);
var casToken = ConfigurationElement.getAttributeWithKey("CASToken")["value"]
if(!casToken){
throw "no CAS Token";
}
//REST Template
var opName = "casLogin";
var opTemplate = "/iaas/login";
var opMethod = "POST";
// create the REST operation:
var opLogin = System.getModule("au.com.cs.example").createOp(restHost,opName,opMethod,opTemplate);
//cas API Token
var contentObject = {"refreshToken":casToken}
postContent = JSON.stringify(contentObject);
var loginResponse = System.getModule("au.com.cs.example").executeOp(opLogin,null,postContent,null) ;
try{
var tokenResponse = JSON.parse(loginResponse)['token']
System.debug("token: " + tokenResponse);
} catch (ex) {
throw ex + " No valid token";
}
//REST Template Machine Details
var opName = "machineDetails";
var opTemplate = "/iaas/machines/" + resourceId;
var opMethod = "GET";
var bearer = "Bearer " + tokenResponse;
var opMachine = System.getModule("au.com.cs.example").createOp(restHost,opName,opMethod,opTemplate);
// (Rest Operation, Params, Content, Auth Token)
var vmResponse = System.getModule("au.com.cs.example").executeOp(opMachine,null,"",bearer) ;
try{
var vm = JSON.parse(vmResponse);
} catch (ex) {
throw ex + " failed to parse vm details"
}
System.log("cpuCount: " + vm["customProperties"]["cpuCount"]);
System.log("memoryInMB: " + vm["customProperties"]["memoryInMB"]);
cpuCount = vm["customProperties"]["cpuCount"];
memoryMB = vm["customProperties"]["memoryInMB"];
此脚本将输出 cpuCount 和 memoryMB 发送到父工作流,并更新现有 customProperties 属性。创建 CMDB 时,可以在后续工作流中使用这些值。
- 将“创建 ServiceNow CMDB CI”脚本元素添加到工作流中。此元素使用配置项查找 ServiceNow REST 主机,为 cmdb_ci_vmware_instance 表创建 REST 操作,基于 post 数据的工作流输入创建一系列内容对象,并输出返回的 sys_id。
var configPath = "CS"
var configName = "environmentConfig"
var attributeName = "serviceNowRestHost"
var tableName = "cmdb_ci_vmware_instance"
//get REST Host from configuration element
var restHost = System.getModule("au.com.cs.example").getRestHostFromConfig(configPath,configName,attributeName)
//REST Template
var opName = "serviceNowCreatCI";
var opTemplate = "/api/now/table/" + tableName;
var opMethod = "POST";
// create the REST operation:
var opCI = System.getModule("au.com.cs.example").createOp(restHost,opName,opMethod,opTemplate);
//cmdb_ci_vm_vmware table content to post;
var contentObject = {};
contentObject["name"] = hostname;
contentObject["cpus"] = cpuTotalCount;
contentObject["memory"] = MemoryInMB;
contentObject["correlation_id"]= deploymentId
contentObject["disks_size"]= diskProvisionGB
contentObject["location"] = "Sydney";
contentObject["vcenter_uuid"] = vcUuid;
contentObject["state"] = "On";
contentObject["owned_by"] = owner;
postContent = JSON.stringify(contentObject);
System.log("JSON: " + postContent);
// (Rest Operation, Params, Content, Auth Token)
var ciResponse = System.getModule("au.com.cs.example").executeOp(opCI,null,postContent,null) ;
try{
var cmdbCI = JSON.parse(ciResponse);
} catch (ex) {
throw ex + " failed to parse ServiceNow CMDB response";
}
serviceNowSysId = cmdbCI['result']['sys_id'];
- 使用来自子工作流的输出,使用现有 customProperties 创建一个属性对象并使用来自 ServiceNow 的值覆盖 serviceNowSysId 属性。此唯一 ID 在 CMDB 中用于将实例标记为销毁时注销。