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로 인코딩된 task
와 ci_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
상태 코드를 반환합니다.
워크플로우 액션의 나머지 필드는 채울 필요가 없습니다. 이들은 주로 디버깅 및 알림 용도로 사용됩니다.