Используя действия с поддержкой расширяемости, службу Cloud Assembly можно интегрировать с корпоративными решениями для управления ИТ-службами (ITSM), такими как ServiceNow.

Интеграция ServiceNow выполняется через несколько API-интерфейсов и служб Cloud Assembly, Amazon Web Services и ServiceNow.
В корпоративной среде платформа управления облаком часто интегрируется с платформой управления ИТ-службами (ITSM) и базой данных управления конфигурациями (CMDB) для соответствия нормативным требованиям. Следуя данному примеру, можно интегрировать службу Cloud Assembly с решением ServiceNow для базы данных управления конфигурациями (CMDB) и управления ИТ-службами (ITSM) с помощью сценариев действий расширяемости.
Примечание: Кроме того, интегрировать ServiceNow со службой Cloud Assembly можно, используя рабочие процессы vRealize Orchestrator. Дополнительные сведения об интеграции с решением ServiceNow с помощью рабочих процессов см. в разделе Интеграция службы Cloud Assembly с решением ServiceNow для управления ИТ-службами (ITSM) с помощью рабочих процессов vRealize Orchestrator.

Чтобы создать эту интеграцию, потребуется четыре сценария действий с поддержкой расширяемости. Первые три сценария инициируются последовательно во время предоставления ресурсов событием «После предоставления вычислительных ресурсов». Четвертый сценарий запускается событием «После удаления вычислительных ресурсов».

Дополнительные сведения о темах событий см. в разделе Темы событий, предоставленные с помощью Cloud Assembly.

Четыре сценария действий расширяемости имеют разные уровни приоритета. Наивысший уровень приоритета отведен для сценариев получения сведений о ВМ и списания расширения непрерывной интеграции базы данных управления конфигурациями в ServiceNow.

Получение сведений о ВМ

Сценарий «Получение сведений о ВМ» получает дополнительные сведения о полезных данных, необходимые для создания непрерывной интеграции, и маркер идентификации из Amazon Web Services Systems Manager Parameter Store (SSM). Кроме того, этот сценарий обновляет раздел customProperties, добавляя в него дополнительные свойства для дальнейшего использования.

Создание непрерывной интеграции базы данных управления конфигурациями в ServiceNow
Сценарий «Создание непрерывной интеграции базы данных управлениям конфигурациями в ServiceNow» передает URL-адрес экземпляра ServiceNow в качестве входных данных и сохраняет экземпляр в SSM для соответствия требованиям безопасности. Этот сценарий также считывает ответ уникального идентификатора записи базы данных управления конфигурациями ServiceNow (sys_id). Он передает этот ответ в качестве выходного значения и записывает настраиваемое свойство serviceNowSysId в процессе создания. Это значение используется для того, чтобы пометить непрерывную интеграцию как списанную при удалении экземпляра.
Примечание: Может потребоваться выделение дополнительных разрешений для роли vRealize Automation services Amazon Web Services, чтобы разрешить Lambda доступ к SSM Parameter Store.

Создание изменения в ServiceNow

Этот сценарий завершает интеграцию ITSM путем передачи URL-адреса экземпляра ServiceNow в качестве входных данных и сохранения учетных данных ServiceNow в качестве SSM в соответствии с требованиями безопасности.

Создание изменения в ServiceNow

Сценарий списания непрерывной интеграции базы данных управления конфигурациями в ServiceNow приводит к остановке ServiceNow и помечает непрерывную интеграцию как списанную в соответствии с настраиваемым свойством serviceNowSysId, созданным сценарием создания интеграции.

Необходимые условия

  • Перед настройкой интеграции отфильтруйте все подписки на события с помощью условного свойства облачного шаблона: event.data["customProperties"]["enable_servicenow"] === "true"
    Примечание: Облачные шаблоны, которым требуется интеграция с ServiceNow, включают в себя этой свойство.
  • Загрузите и установите Python.

Дополнительные сведения о фильтрации подписок см. в разделе Создание подписки с поддержкой расширяемости.

Процедура

  1. Откройте командную строку на виртуальной машине.
  2. Запустите сценарий «Получение сведений о ВМ».
    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. Запустите действие по созданию элемента конфигурации 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. Запустите сценарий действия «Создание».
    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)

Результаты

Служба Cloud Assembly успешно интегрирована с системой управления ИТ-службами ServiceNow.

Дальнейшие действия

При необходимости эту непрерывную интеграцию можно пометить как списанную, используя действие списания элемента конфигурации 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)

Дополнительные сведения об использовании действий с поддержкой расширяемости для интеграции системы ServiceNow со службой Cloud Assembly см. в разделе Расширение Cloud Assembly с помощью действий ABX для интеграции с ServiceNow.