개요

Rootly의 ServiceNow 통합은 워크플로우를 활용하여 ServiceNow 티켓을 자동으로 생성하고 업데이트합니다. 워크플로우 기능에 익숙하지 않은 경우 먼저 우리의 워크플로우 문서를 참조하세요.

워크플로우

ServiceNow 인시던트 생성

이 워크플로우 액션은 Incident 테이블(예: INC0010001)에 레코드를 생성하고 Rootly 인시던트 레코드에 연결합니다.

ServiceNow 인시던트 업데이트

이 워크플로우 액션은 Incident 테이블(예: INC0010001)의 기존 레코드의 데이터 속성을 업데이트합니다.

일반적인 사용자 정의 필드

주요 인시던트

// Example create major incident (make sure acts_as_user is set) and ACL good (Cf. https://community.servicenow.com/community?id=community_question&sys_id=fae73aeb1b7370900b8a9979b04bcb1a)
{
  "assignment_group": "3De45d9ebc3b333200fe02c9bb34efc434",
  "major_incident_state": "proposed"
}

작업 노트

작업 노트는 ServiceNow 인시던트에 추가할 수 있는 내부 댓글입니다. 작업 노트는 고객에게 보이지 않습니다.

{
 "work_notes": "{{ incident.events[0].event_raw }}"
}

댓글

댓글은 ServiceNow 인시던트에 추가할 수 있으며 고객이 볼 수 있습니다.

{
  "comments": "{{ incident.events[0].event_raw }}"
}

인시던트에 구성 항목(CI) 추가

인시던트에 구성 항목(CI)을 추가하는 것은 ServiceNow API의 기술적 제한으로 인해 복잡한 작업입니다. 이 작업을 용이하게 하기 위해 Rootly의 HTTP 클라이언트 워크플로우 액션을 사용하여 여러 ServiceNow API 호출을 단일 액션으로 통합해야 합니다.

인시던트에 CI를 추가하기 위해 사용할 ServiceNow API는 테이블 API입니다.

curl -X POST \
'https://<instance-domain>.com/api/now/table/task_ci' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic <username:password>' \
--data '{
  "task": "<incident_id>",
  "ci_item": "<ci_sys_id>"
}'

ServiceNow API는 API 호출당 하나의 CI만 추가할 수 있으므로, 그들의 배치 API를 사용하여 여러 테이블 API 호출을 함께 래핑하고 Rootly의 HTTP 클라이언트 워크플로우 액션을 활용하여 호출을 수행합니다.

이름

이 필드는 자동으로 설정됩니다. 액션을 가장 잘 설명하는 이름으로 이 필드의 이름을 바꿀 수 있습니다. 이 필드의 값은 워크플로우 액션의 동작에 영향을 미치지 않습니다.

URL

이것은 ServiceNow 배치 API의 엔드포인트입니다. 값은 다음 형식이어야 합니다: https://<instance-domain>.com/api/now/v1/batch

메소드

이것은 API 작업입니다. 이 경우 POST를 선택하세요.

헤더 매개변수

이것은 배치 API에 필요한 헤더 매개변수입니다. 값은 JSON 형식으로 구성되며 인증 토큰을 포함합니다.

비관리자에게 사용자 이름:비밀번호가 보이지 않게 하려면 Rootly에서 비밀 변수로 저장할 수 있습니다.

이 경우 다음 형식으로 설정하세요:

//using exposed username:password
{
  "Accept": "application/json",
  "Content-Type": "application/json",
  "Authorization": "Basic <base64 encoded username:password>"
}

//using Rootly secret - this is the recommended method
{
  "Accept": "application/json",
  "Content-Type": "application/json",
  "Authorization": "Basic {{ secrets.service_now_key_encoded }}"
}

쿼리 매개변수

이것은 POST 호출이므로 쿼리 매개변수가 없습니다. 이 필드를 비워두세요.

본문 매개변수

본문은 개별 테이블 API 호출을 단일 본문으로 통합하고자 하는 곳입니다.

body 필드의 개별 API 호출은 BATCH API 내부에 래핑되어 base64로 인코딩되어야 합니다.

형식은 다음과 같습니다:

//includes base64 encoding of body field
//this format is required to complete the API call
{
  "batch_request_id": "1",
  "rest_requests": [
    {
      "id": "11",
      "headers": [
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "url": "/api/now/table/task_ci",
      "method": "POST",
      "body": {<base64 encode of request body>}
    },
    {
      "id": "12",
      "headers": [
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "url": "/api/now/table/task_ci",
      "method": "POST",
      "body": {<base64 encode of request body>}
    },
    {
      "id": "13",
      "headers": [
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "url": "/api/now/table/task_ci",
      "method": "POST",
      "body": {<base64 encode of request body>}
    }
  ]
}

//body field is NOT base64 encoded
//this format is just to show you the raw data
{
  "batch_request_id": "1",
  "rest_requests": [
    {
      "id": "11",
      "headers": [
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "url": "/api/now/table/task_ci",
      "method": "POST",
      "body": {
        "task": "<incident_id>",
        "ci_item": "<ci_1_sys_id>"
      }
    },
    {
      "id": "12",
      "headers": [
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "url": "/api/now/table/task_ci",
      "method": "POST",
      "body": {
        "task": "<incident_id>",
        "ci_item": "<ci_2_sys_id>"
      }
    },
    {
      "id": "13",
      "headers": [
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "url": "/api/now/table/task_ci",
      "method": "POST",
      "body": {
        "task": "<incident_id>",
        "ci_item": "<ci_3_sys_id>"
      }
    }
  ]
}

일반적인 사용 사례는 Rootly 인시던트에 대해 선택된 services를 ServiceNow 인시던트에 자동으로 Affected CIs로 추가하는 것입니다.

이 사용 사례를 지원하려면 각 ServiceNow CI의 sys_id를 해당하는 Rootly services에 연결해야 합니다.

다음 구문은 Liquid 구문을 활용하여 각 테이블 API 호출에서 base64로 인코딩된 taskci_item 필드를 동적으로 설정합니다:

{
  "batch_request_id": "1",
  "rest_requests": [
{% for service in genius_workflow_run.newly_added_services %}

{% assign task_value = incident.service_now_incident_id %}
{% assign ci_item_value = service | get: 'service_now_ci_sys_id' %}
{% assign body_string = '{ "task": "' | append: task_value | append: '", "ci_item": "' | append: ci_item_value | append: '" }' %}


    {
      "id": "1{{ forloop.index }}",
      "headers": [
        {
          "name": "Content-Type",
          "value": "application/json"
        }
      ],
      "url": "/api/now/table/task_ci",
      "method": "POST",
      "body": "{{ body_string | base64_encode }}"
    }{% unless forloop.last %},{% endunless %}
{% endfor %}
  ]
}

성공 상태

200로 설정하세요. 대부분의 POST 요청이 201를 반환하는 것과 달리, ServiceNow의 배치 API의 POST 엔드포인트는 성공을 나타내기 위해 200 상태 코드를 반환합니다.

워크플로우 액션의 나머지 필드는 채울 필요가 없습니다. 이들은 주로 디버깅 및 알림 용도로 사용됩니다.