使用 vRealize Orchestrator 托管的工作流,可以将 Cloud Assembly 与 ServiceNow 集成以实现 ITSM 合规性

ServiceNow 集成流经过几个 Cloud Assembly、vSphere、vRealize Orchestrator 以及 ServiceNow 服务和 API。

企业用户通常将其云计算管理平台与 IT 服务管理 (IT Service Management, ITSM) 和配置管理数据库 (Configuration Management Database, CMDB) 平台集成以实现合规性。按照此示例,可以使用 vRealize Orchestrator 托管的工作流将 Cloud Assembly 与适用于 CMDB 和 ITSM 的 ServiceNow 集成。使用 vRealize Orchestrator 集成和工作流时,如果您有多个用于不同环境的实例,则功能标记特别有用。有关功能标记的详细信息,请参见 在 Cloud Assembly 中使用功能标记
注: 还可以使用可扩展性操作脚本将 ServiceNow 与 Cloud Assembly 集成。有关使用可扩展性操作脚本集成 ServiceNow 的信息,请参见 如何使用可扩展性操作将 Cloud Assembly 与 ServiceNow 集成

在此示例中,ServiceNow 集成由三个顶级工作流组成。每个工作流都有自己的订阅,以便您可以单独更新和迭代每个组件。

  • 事件订阅入口点 - 基本日志记录,标识请求用户和 vCenter VM(如果适用)。
  • 集成工作流 - 分离对象并将输入传递到技术工作流,处理日志记录、属性和输出更新。
  • 技术工作流 - 下游系统集成,供 ServiceNow API 用于创建具有负载和其他虚拟机属性的 CMDB CI、CR 和 Cloud Assembly IaaS API。

前提条件

过程

  1. vRealize Orchestrator 中创建并保存包含多个工作流中常用配置的配置文件。
  2. Cloud Assembly API 令牌保存到与步骤 1 中的配置文件相同的位置。
    注: Cloud Assembly API 令牌会过期。
  3. 使用提供的脚本元素在 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"];

    此脚本将输出 cpuCountmemoryMB 发送到父工作流,并更新现有 customProperties 属性。创建 CMDB 时,可以在后续工作流中使用这些值。

  4. 将“创建 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'];
  5. 使用来自子工作流的输出,使用现有 customProperties 创建一个属性对象并使用来自 ServiceNow 的值覆盖 serviceNowSysId 属性。此唯一 ID 在 CMDB 中用于将实例标记为销毁时注销。

结果

Cloud Assembly 已成功与 ITSM ServiceNow 集成。有关如何使用工作流在 Cloud Assembly 中集成 ServiceNow 的更多信息,请参见使用 vRealize Orchestrator 为 ServiceNow 集成扩展 Cloud Assembly