728x90
300x250
제가 원하는 바는 아래와 같습니다.
Grafana에 알람이 발생했을 경우 그것을 Slack으로 확인하고 필요한 Command를 Slack에 날려주면
Flask(bot)이 이를 확인하여 Command를 실행시키는 것입니다.
코드는 아래와 같습니다.
준비물은 Salck bot의 토큰, Grafana의 Slack을 통한 알람, 실행할 Command가 필요합니다.
import json, requests, subprocess
from flask import Flask, request, make_response
from slack_sdk import WebClient
token = "" # Slack bot의 토큰
app = Flask(__name__)
def post_message(token, channel, text):
response = requests.post("https://slack.com/api/chat.postMessage",
headers={"Authorization": "Bearer "+token},
data={"channel": channel,"text": text}
)
print(response)
def get_answer(user_query):
return user_query
def event_handler(event_type, slack_event):
channel = slack_event["event"]["channel"]
string_slack_event = str(slack_event)
if string_slack_event.find("{'type': 'user', 'user_id': ") != -1: # 멘션으로 호출
try:
user_query = slack_event['event']['blocks'][0]['elements'][0]['elements'][1]['text']
answer = get_answer(user_query) # answer에 Slack으로 들어온 @Grafana 의 명령어들을 넣어줍니다.
command=list(answer.strip().split(' '))
cmd = command[1]
ip = command[2]
print(command)
with open("/etc/ansible/hosts", "a") as f:
f.write('\n'+ip)
print('test')
f.close()
if command[0] == 'node-exporter': # 명령어에 따라 실행할 구문을 작성합니다.
flag = subprocess.run(['ansible-playbook', 'node-play.yml'])
print(flag)
post_message(token, "grafana-alert", flag) # Slack으로 명령어가 잘 전송 됐는지
# 확인할 수 있게 메시지를 보내줍니다.
# 아래의 subprocess 부분은 Python의 ssh구문을 실행시키는 명령어들입니다.
subprocess.run(['sudo', 'sed', '-i','$d','/etc/ansible/hosts'])
subprocess.run(['cd', '/home/daou_docker/nginx'])
subprocess.run(['sudo', 'docker-compose', 'down'])
subprocess.run(['sudo', 'docker-compose', 'up', '-d'])
return make_response("ok", 200, )
except IndexError:
pass
message = "[%s] cannot find event handler" % event_type
return make_response(message, 200, {"X-Slack-No-Retry": 1})
@app.route('/', methods=['POST'])
def hello_there():
slack_event = json.loads(request.data)
if "challenge" in slack_event:
return make_response(slack_event["challenge"], 200, {"content_type": "application/json"})
if "event" in slack_event:
event_type = slack_event["event"]["type"]
return event_handler(event_type, slack_event)
return make_response("There are no slack request events", 404, {"X-Slack-No-Retry": 1})
if __name__ == '__main__':
app.run(host = '0.0.0.0', debug=False, port=8000)
실행 결과는 아래와 같습니다
알람이 발생했을 경우
사용자는 @Grafana를 하면서 명령문을 실행시키겠다는 핸들러를 만들고
그 뒤에 적혀있는 명령문들을 Flask(bot)에 넘겨줍니다.
Flask는 명령문을 스크립트에 맞춰서 실행시키고 결과값을 다시 Slack으로 넘겨줍니다.
사용자는 Slack을 통해 결과를 알 수 있고 시간이 흐르면 RESOLVED의 메시지가 오면서
정상적으로 작동하는 것을 확인할 수 있었습니다.
728x90
300x250
'Python' 카테고리의 다른 글
Python Fabric 명령어 모음 (0) | 2022.05.09 |
---|---|
Pipenv 명령어 모음 (0) | 2022.03.15 |
파이썬-실습(12) HTML로 파일 log내용 확인하기 (0) | 2022.01.12 |
파이썬 - Deque(데크) (0) | 2021.12.20 |
파이썬-실습(11) 카카오 챗봇과 앱의 연계 (0) | 2021.12.17 |