Con las acciones de extensibilidad, es posible integrar Cloud Assembly con una ITSM empresarial, como ServiceNow.

El flujo de integración de ServiceNow pasa por varios servicios y API de Cloud Assembly, Amazon Web Services y ServiceNow.
Los usuarios empresariales suelen integrar sus plataformas de administración de nube con una plataforma de administración de servicios de TI (IT Service Management, ITSM) y de base de datos de administración de configuración (Configuration Management Database, CMDB) para garantizar el cumplimiento. Si sigue este ejemplo, puede integrar Cloud Assembly con ServiceNow para CMDB e ITSM mediante scripts de acciones de extensibilidad.
Nota: ServiceNow también se puede integrar con Cloud Assembly mediante flujos de trabajo de vRealize Orchestrator. Para obtener información sobre la integración de ServiceNow mediante flujos de trabajo, consulte Cómo integrar Cloud Assembly para ITSM con ServiceNow mediante flujos de trabajo de vRealize Orchestrator.

Para crear esta integración, se utilizan cuatro scripts de acciones de extensibilidad. Los tres primeros scripts se inician en secuencia durante el aprovisionamiento, en el evento de publicación de aprovisionamiento de recursos informáticos. El cuarto script se activa en el evento de publicación de eliminación de recursos informáticos.

Para obtener más información sobre los temas de eventos, consulte Temas de eventos proporcionados con Cloud Assembly.

Los cuatro scripts de acciones de extensibilidad tienen diferentes niveles de prioridad. El nivel de prioridad más alto se otorga para los scripts de acción de extensibilidad de CI de CMDB Obtener detalles de la máquina virtual y Retirar el servicio ahora.

Obtener detalles de máquina virtual

El script Obtener detalles de máquina virtual obtiene los detalles de carga útil adicionales necesarios para la creación de un CI y un token de identidad que se almacena en Amazon Web Services Systems Manager Parameter Store (SSM). Además, este script actualiza customProperties con propiedades adicionales para un uso posterior.

Crear CI de CMDB de ServiceNow
El script Crear CI de CMDB de ServiceNow pasa la URL de instancia de ServiceNow como una entrada y almacena la instancia en SSM para cumplir con los requisitos de seguridad. Este script también lee la respuesta de identificador de registro único de la CMDB de ServiceNow (sys_id). Pasa esa respuesta como salida y escribe la propiedad personalizada serviceNowSysId durante la creación. Este valor se usa para marcar el elemento de configuración como retirado cuando la instancia se destruye.
Nota: Es posible que sea necesario asignar permisos adicionales a la función vRealize Automation services de Amazon Web Services para permitir que Lambda acceda a SSM Parameter Store.

Crear cambio de ServiceNow

Este script finaliza la integración de ITSM pasando la URL de la instancia de ServiceNow como entrada y almacenando las credenciales de ServiceNow como SSM para cumplir los requisitos de seguridad.

Crear cambio de ServiceNow

El script para retirar un elemento de configuración de CMDB de ServiceNow solicita a ServiceNow que se detenga y marca el elemento de configuración como retirado en función de la propiedad personalizada serviceNowSysId que se creó en el script de creación.

Requisitos previos

  • Antes de configurar esta integración, filtre todas las suscripciones de evento por la siguiente propiedad de plantilla de nube condicional: event.data["customProperties"]["enable_servicenow"] === "true"
    Nota: Esta propiedad existe en las plantillas de nube que requieren una integración de ServiceNow.
  • Descargue e instale Python.

Para obtener más información sobre cómo filtrar suscripciones, consulte Crear una suscripción de extensibilidad.

Procedimiento

  1. Abra una ventana de línea de comandos en la máquina virtual.
  2. Ejecute el script para obtener detalles de máquina virtual.
    from botocore.vendored import requests
    import json
    import boto3
    client = boto3.client('ssm','ap-southeast-2')
    
    def handler(context, inputs):
        baseUri = inputs['url']
        casToken = client.get_parameter(Name="casToken",WithDecryption=True)
        
        url = baseUri + "/iaas/login"
        headers = {"Accept":"application/json","Content-Type":"application/json"}
        payload = {"refreshToken":casToken['Parameter']['Value']}
        
        results = requests.post(url,json=payload,headers=headers)
        
        bearer = "Bearer "
        bearer = bearer + results.json()["token"]
        
        deploymentId = inputs['deploymentId']
        resourceId = inputs['resourceIds'][0]
        
        print("deploymentId: "+ deploymentId)
        print("resourceId:" + resourceId)
        
        machineUri = baseUri + "/iaas/machines/" + resourceId
        headers = {"Accept":"application/json","Content-Type":"application/json", "Authorization":bearer }
        resultMachine = requests.get(machineUri,headers=headers)
        print("machine: " + resultMachine.text)
        
        print( "serviceNowCPUCount: "+ json.loads(resultMachine.text)["customProperties"]["cpuCount"] )
        print( "serviceNowMemoryInMB: "+ json.loads(resultMachine.text)["customProperties"]["memoryInMB"] )
        
        #update customProperties
        outputs = {}
        outputs['customProperties'] = inputs['customProperties']
        outputs['customProperties']['serviceNowCPUCount'] = int(json.loads(resultMachine.text)["customProperties"]["cpuCount"])
        outputs['customProperties']['serviceNowMemoryInMB'] = json.loads(resultMachine.text)["customProperties"]["memoryInMB"]
        return outputs
  3. Ejecute la acción de creación del elemento de configuración de CMDB.
    from botocore.vendored import requests
    import json
    import boto3
    client = boto3.client('ssm','ap-southeast-2')
    
    def handler(context, inputs):
    
        snowUser = client.get_parameter(Name="serviceNowUserName",WithDecryption=False)
        snowPass = client.get_parameter(Name="serviceNowPassword",WithDecryption=True)
        table_name = "cmdb_ci_vmware_instance"
        url = "https://" + inputs['instanceUrl'] + "/api/now/table/{0}".format(table_name)
        headers = {'Content-type': 'application/json', 'Accept': 'application/json'}
        payload = {
            'name': inputs['customProperties']['serviceNowHostname'],
            'cpus': int(inputs['customProperties']['serviceNowCPUCount']),
            'memory': inputs['customProperties']['serviceNowMemoryInMB'],
            'correlation_id': inputs['deploymentId'],
            'disks_size': int(inputs['customProperties']['provisionGB']),
            'location': "Sydney",
            'vcenter_uuid': inputs['customProperties']['vcUuid'],
            'state': 'On',
            'sys_created_by': inputs['__metadata']['userName'],
            'owned_by': inputs['__metadata']['userName']
            }
        results = requests.post(
            url,
            json=payload,
            headers=headers,
            auth=(snowUser['Parameter']['Value'], snowPass['Parameter']['Value'])
        )
        print(results.text)
    
        #parse response for the sys_id of CMDB CI reference
        if json.loads(results.text)['result']:
            serviceNowResponse = json.loads(results.text)['result']
            serviceNowSysId = serviceNowResponse['sys_id']
            print(serviceNowSysId)
    
            #update the serviceNowSysId customProperty
            outputs = {}
            outputs['customProperties'] = inputs['customProperties']
            outputs['customProperties']['serviceNowSysId'] = serviceNowSysId;
            return outputs
  4. Ejecute el script de acción de creación.
    from botocore.vendored import requests
    import json
    import boto3
    client = boto3.client('ssm','ap-southeast-2')
    
    def handler(context, inputs):
        snowUser = client.get_parameter(Name="serviceNowUserName",WithDecryption=False)
        snowPass = client.get_parameter(Name="serviceNowPassword",WithDecryption=True)
        table_name = "change_request"
        url = "https://" + inputs['instanceUrl'] + "/api/now/table/{0}".format(table_name)
        headers = {'Content-type': 'application/json', 'Accept': 'application/json'}
        payload = {
            'short_description': 'Provision CAS VM Instance'      
                  }
        results = requests.post(
            url,
            json=payload,
            headers=headers,
            auth=(snowUser['Parameter']['Value'], snowPass['Parameter']['Value'])
        )
        print(results.text)

Resultados

Cloud Assembly se integra correctamente con ServiceNow para ITSM.

Qué hacer a continuación

Si desea retirar el CI, puede hacerlo con la acción de retirada de elemento de configuración de CMDB:
from botocore.vendored import requests
import json
import boto3
client = boto3.client('ssm','ap-southeast-2')

def handler(context, inputs):
    snowUser = client.get_parameter(Name="serviceNowUserName",WithDecryption=False)
    snowPass = client.get_parameter(Name="serviceNowPassword",WithDecryption=True)
    tableName = "cmdb_ci_vmware_instance"
    sys_id =inputs['customProperties']['serviceNowSysId']
    url = "https://" + inputs['instanceUrl'] + "/api/now/"+tableName+"/{0}".format(sys_id)
    headers = {'Content-type': 'application/json', 'Accept': 'application/json'}
    payload = {
        'state': 'Retired'
        }

    results = requests.put(
        url,
        json=payload,
        headers=headers,
        auth=(inputs['username'], inputs['password'])
    )
    print(results.text)

Para obtener más información sobre la forma de usar las acciones de extensibilidad para integrar ServiceNow en Cloud Assembly, consulte Extender Cloud Assembly con extensibilidad basada en acciones para la integración de ServiceNow.