VMware Skyline API ile JIRA Ticket Yönetimi
Bu makalede Python Skyline API ile JIRA da ticket yönetimi ile ilgili bilgiler paylaşacağım. Aynı zamanda buradaki vSphere Skyline bulgularını Slack kanalına gönderip alarm oluşturacağız. Bir önceki makalede Skyline Insights API yi nasıl kullanabileceğimizden bahsetmiştim. Eğer Skyline Insights API kullanımı ve buradaki veri setlerini henüz incelemediyseniz aşağıdaki makaleyi okumanızı öneririm.
Öncelikle Skyline API Token bilgisi ile bir access token oluşturup sonrasında ilgili bulguları listelememiz gerekiyor. Topladığımız bilgileri hem JIRA ya hem de Slack kanalına göndereceğiz. Bu işlemleri yapabilmek adına gerekli olan değişkenler aşağıdaki gibidir. Skyline API TOKEN ile beraber sites.json dosyasında ilgili vSphere ortamız, JIRA erişim bilgileriniz ve Slack Webhook URL bilgilerini güncellemeniz gerekiyor.
Eğer farklı vSphere ortamlarına ait Slack alarm kanallarınız var ve bu ortamlar ile farklı ekipler ilgileniyorsa sites.json dosyasında ortam bilgilerinizi güncelledikten sonra tüm ortamların aktif bulgularını JIRA üzerinde kayıtlarını açıp her ortama ait Slack kanalında bildirimlerini alabilirsiniz. Github profilimden projenin tamamına erişebilirsiniz.
import json
import time
import requests
from jira import JIRA
from slack_sdk.webhook import WebhookClient
APITOKEN = "Your-API-Token"
SKYLINEAPI = "https://skyline.vmware.com/public/api/data"
SKYLINEACCESS = "https://console.cloud.vmware.com/csp/gateway/am/api/auth/api-tokens/"
{
"sites": [{
"location": "Site-A",
"vcenter": "site-a.vcenter.local",
"jira": {
"project": "AAA",
"username": "jira-username",
"token": "JIRA-Token",
"url": "https://jira.corporate.com"
},
"slackurl": "Slack-Webhook-URL-for-SiteA-notification-channel"
}
]
}
Access Token oluşturduktan sonra aşağıdaki gibi response çıktısını bir değişkene atıyoruz.
response = requests.post(
url=SKYLINEAPI, data=json.dumps(data), headers=headers)
responseJson = response.json()
activeFindings = responseJson['data']['activeFindings']
findings = activeFindings['findings']
Bir önceki makaledeki gibi mevcut bulguları görüntüleyip her bir bulgu için içerisindeki affected objeleri de listelemek adına ayrı bir döngü oluşturmanız gerekiyor.
def getAffectedObject(findingList, vcenter):
findvcenter = vcenter
for finding in findingList:
findingAffectedObjects = ""
findingDisplayName = finding['findingDisplayName']
severity = finding['severity']
totalAffectedObjects = finding['totalAffectedObjectsCount']
category = finding['categoryName']
risk = finding['findingImpact']
findingDescription = finding['findingDescription']
recommendations = finding['recommendations']
kbLinkURLs = finding['kbLinkURLs']
objectCount = 1
for object in finding['affectedObjects']:
findingAffectedObjects += "- " + object['objectName'] + "\n"
objectCount += 1
print("Collecting " + findingDisplayName + " details from Skyline")
sendJIRA(findingDisplayName, severity, findingDescription, recommendations, findingAffectedObjects, kbLinkURLs, totalAffectedObjects, category, risk, findvcenter )
Topladığımız bulguları JIRA fonksiyonunda issue olarak açılmasını sağlıyoruz.
def sendJIRA(findingDisplayName, severity, findingDescription, recommendations, findingAffectedObjects, kbLinkURLs, totalAffectedObjects, category, risk, vcenter):
vcenter_list = data["sites"]
for vcenter in vcenter_list:
vcenter_value = vcenter["vcenter"]
if(jsonDATA == vcenter_value):
jiraProjectKey = vcenter["jira"]["project"]
jiraUsername = vcenter["jira"]["username"]
jiraToken = vcenter["jira"]["token"]
jiraURL = vcenter["jira"]["url"]
slackURL = vcenter["slackurl"]
match severity:
case "CRITICAL":
priority = 'High'
storyPoint = 5
case "MODERATE":
priority = 'Medium'
storyPoint = 3
case "TRIVIAL":
priority = 'Low'
storyPoint = 3
jira_connection = JIRA(basic_auth=(jiraUsername, jiraToken), options={'server': jiraURL})
epic = jira_connection.search_issues("project=" + jiraProjectKey + " and type='Epic'" + " and summary ~ " + epicName)
issue_dict = {
'project': {'key': jiraProjectKey},
'summary': findingDisplayName,
'description': issueDescription,
'customfield_10000': storyPoint,
'customfield_10001': issueRecommendation,
'customfield_10002' : findingAffectedObjects,
'customfield_10003' : epic[0].key,
'labels': ["Healthcheck", "System"],
'priority':{'name': priority},
'issuetype': {'name': 'Task'},
}
issueList = jira_connection.search_issues("project=" + jiraProjectKey + " and status='to do'" + " and summary ~ " + summary)
if (issueList):
issue = issueList[0]
issue.update(description = issueDescription)
issue.update(fields={'customfield_10002': findingAffectedObjects})
issueKey = issue.key
issueUpdated = True
else:
newIssue = jira_connection.create_issue(fields=issue_dict)
issueKey = newIssue.key
issueUpdated = False
print("Creating issue for " + findingDisplayName)
if issueUpdated == False:
sendSlack(findingDisplayName, severity, totalAffectedObjects, category, risk, issueKey, jiraURL, slackURL)
Aynı bulguları Slack fonksiyonunda ilgili kanala bildirim olarak iletiyoruz.
def sendSlack(findingName, severity, totalAffectedObjects, category, risk, issueKey, jiraURL, slackURL):
warningEmoji = ':warning:'
alertEmoji1 = ':alert:'
alertEmoji2 = ':alert-blue:'
alertEmoji3 = ':orange_alert:'
issueButtonURL = jiraURL + "/browse/" + issueKey
match severity:
case "CRITICAL":
emoji = alertEmoji1
case "MODERATE":
emoji = alertEmoji2
case "TRIVIAL":
emoji = alertEmoji3
webhook = WebhookClient(slackURL)
response = webhook.send("Slack-Formatted-Message")
print("Sending " + findingName +" details to Slack channel...")
Aşağıda örnek script sonuçlarını bulabilirsiniz. Skyline Advisor üzerindeki vSphere ortamına ait bulguların JIRA da iş kayıtlarını açıp burada ilgili objeleri ekleyebilir, ön tanımlı iş ağırlıklarınızı işleyebilir ve aynı şekilde Slack kanalınıza bildirim olarak iletebilirsiniz.
Makale içerisindeki kullanılan scriptlere Github profilimden ulaşabilirsiniz.