使用 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 与 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