Gestión de las armas con ServiceNow
En este tema se explica cómo archivar tickets ServiceNow automáticos cada vez que se activan alarmas.
En este escenario, siempre que el uso de CPU supere el umbral especificado por la alarma, se crea un ticket ServiceNow para el ingeniero de guardias.
No introduzca información confidencial al asignar descripciones, etiquetas ni nombres fáciles de recordar a los recursos de la nube mediante la consola, la API o la CLI de Oracle Cloud Infrastructure.
Este escenario implica escribir una función en los tickets ServiceNow (y crear un secreto para almacenar las credenciales ServiceNow), agregar esa función y el correo electrónico opcional como suscripciones a un tema y crear una alarma que envíe mensajes a ese tema cuando se supere el umbral de alarma. Los fans del mensaje se envían a las suscripciones del tema, que incluye una dirección de correo electrónico de grupo además de la función. Al recibir el mensaje, se llama a la función.
Todo menos la función se puede configurar en la consola. También puede utilizar la CLI o API de Oracle Cloud Infrastructure, que permite ejecutar las operaciones individuales.
En el siguiente diagrama se ilustra el flujo de proceso general:
Almacene sus credenciales ServiceNow en un secreto
Cree un secreto al que hará referencia más adelante al crear la función.
Cree un secreto mediante la consola (también puede crear un secreto mediante la interfaz de línea de comandos (CLI) o la interfaz de programación de aplicaciones (API)).
Creación de la función
Comience con el siguiente código de ejemplo para crear una función para archivar tickets de ServiceNow y, a continuación, autorice a la función a acceder a sus credenciales de ServiceNow en el secreto creado mediante el servicio Oracle Cloud Infrastructure Vault.
El ejemplo de código incluye variables SNOW_URL, SNOW_USER_ID_SEC y SNOW_USER_PWD_SEC que se utilizan en la función hipotética. Puede elegir leer estos valores directamente desde la función o transferir los valores como parámetros de configuración personalizados en su lugar.
#####################################################
# THIS SAMPLE CODE IS FOR DEMO PURPOSES ONLY
#*************************************************
# ******** DO NOT USE IN PRODUCTION *************
# ************************************************
#####################################################
import io
import sys
import oci
import json
import base64
import requests
from fdk import response
SNOW_URL = '<Provide Service Now URL here>'
SNOW_USER_ID_SEC = '<Provide the OCID of OCI Secret for Service Now User ID>'
SNOW_USER_PWD_SEC = '<Provide the OCID of OCI Secret for Service Now User Password>'
OCI_TO_SNOW_SEV_MAP =
{ 'CRITICAL' : '1', 'WARNING' : '2', 'ERROR' : '3', 'INFO' : '4' }
def handler(ctx, data: io.BytesIO = None):
try:
funDataStr = data.read().decode('utf-8')
funDataJSON = json.loads(funDataStr)
alarmData = {}
alarmData['type'] = funDataJSON['type']
alarmData['metaDataList'] = funDataJSON['alarmMetaData']
alarmData['title'] = funDataJSON['title']
alarmData['body'] = funDataJSON['body']
alarmData['sev'] = OCI_TO_SNOW_SEV_MAP[funDataJSON['severity'].upper()]
if alarmData['type'].upper() == 'OK_TO_FIRING':
snowURL = SNOW_URL
snowUsrIDSec = SNOW_USER_ID_SEC
snowUsrPwdSec = SNOW_USER_PWD_SEC
ociResPrncplSigner = oci.auth.signers.get_resource_principals_signer()
ociSecSvc = oci.secrets.SecretsClient(config={}, signer=ociResPrncplSigner)
snowUserID = readSecValueFromSecSvc(ociSecSvc, snowUsrIDSec)
snowPswd = readSecValueFromSecSvc(ociSecSvc, snowUsrPwdSec)
snowData = getSNOWData(alarmData)
sendDataToSnow(snowURL, snowUserID, snowPswd, snowData)
except Exception as e:
sys.stderr.write("Exception : " + str(e))
sys.stderr.write("Exception Class : " + str(e._class_))
return response.Response(ctx, response_data="", headers={"Content-Type": "application/json"})
def sendDataToSnow(snowURL, uid, pwd, snowData):
try:
{
snowHdrs =
"Content-Type" : "application/json",
counter = 0
for sd in snowData:
"Accept" : "application/json" }
snowResp = requests.post(snowURL, auth=(uid, pwd), headers=snowHdrs, data=json.dumps(sd))
except Exception as e:
sys.stderr.write("Exception : " + str(e))
sys.stderr.write("Exception Class : " + str(e._class_))
def getSNOWData(alarmData):
snowData = []
if alarmData['type'].upper() == 'OK_TO_FIRING':
alrmMD = alarmData['metaDataList'][0]
for d in alrmMD['dimensions']:
snowDataElem = {}
snowDataElem['node'] = d['resourceDisplayName']
snowDataElem['source'] = 'OCI'
snowDataElem['severity'] = alarmData['sev']
snowDataElem['description'] = alarmData['body']
snowDataElem['type'] = alarmData['title']
snowData.append(snowDataElem)
return snowData
def readSecValueFromSecSvc(ociSecSvc, secID):
secResp = ociSecSvc.get_secret_bundle(secID)
secContent = secResp.data.secret_bundle_content.content
secret_content = base64.b64decode(secContent).decode('utf-8')
return secret_content
Utilice un grupo dinámico para otorgar a su función la capacidad de leer secretos. La función debe tener esta autorización para acceder a las credenciales ServiceNow, que se almacenan en los secretos que ha creado anteriormente.
Crear el tema
Cree el tema que utilizará para las suscripciones y la alarma.
Un tema es un canal de comunicación para enviar mensajes a suscripciones. Cada nombre de tema es único en el arrendamiento. Puede crear el tema mediante la consola, la interfaz de línea de comandos (CLI) o la interfaz de programación de aplicaciones (API).
Debe desplegar la función antes de utilizarla con un tema.
Crear las suscripciones
Cree la suscripción para el tema.
Una suscripción es un punto final de un tema. Los mensajes publicados se envían a cada suscripción para un tema.
Debe desplegar la función para poder utilizarla con una suscripción y debe tener el permiso FN_INVOCATION
para que la función pueda agregar la función como suscripción a un tema.
- Para crear la suscripción de función mediante la consola:
- Para crear una suscripción de correo electrónico opcional mediante la consola:
- Para crear una suscripción mediante la CLI:
- Para crear una suscripción mediante la API: