리소스.
1. PushOver (스마트폰 알림기능)
2. Python을 이용한 raid(mdadm) 모니터링 소스
https://github.com/omgapuppy/mdadm-check-py
개요.
Python을 보다가 NFS용 서버에 묶여 있는 레이드 상태를 꾸준히 모니터링 할수 있는 방법이 없을까 하고
"python mdadm monitoring"을 검색하다 보니 github에 간단한 모니터링 소스를 찾을수 있었다.
방법은 간단하다
[root@raid ~]# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu Mar 14 17:15:02 2019
Raid Level : raid5
Array Size : 1953258496 (1862.77 GiB 2000.14 GB)
Used Dev Size : 976629248 (931.39 GiB 1000.07 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Mon Apr 15 16:26:15 2019
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : bitmap
Name : raid.doc.co.kr:0 (local to host raid.doc.co.kr)
UUID : 8d6bdd44:99527361:529ac826:7165aa5d
Events : 2511
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
3 8 49 2 active sync /dev/sdd1
mdadm 레이드 상태를 보여주는 명령어를 이용해서 "Failed Devices"값을 찾아서 있으면 PushOver를 이용해서 스마트폰에 경고메세지를 보내는 방식이다.
PushOver는 스마트폰 사용시 트라이얼 버전으로 7일간만 사용하고 만료가 되면 6,000원에 구매해야 된다.
차후에 레이드 상태만 모니터링하는것이 아니라 전반적인 하드웨어 모니터링을 추가해서 구현할수 있을것 같다.
그리고 PushOver를 이용하여 서버에 ping 명령어로 네트워크 상태확인(서버다운)도 가능할것 같다.
PushOver 가입 및 User Key, API Token 발행
PushOver사이트가 가입하면 자동적으로 User Key가 발행된다.
그리고 API Token이라는것은 모듈화 시킨 구분자 같은 역할을 한다.(API Token별 대표아이콘 설정가능)
한 계정으로 여러가지 모니터링을 한다면 API Token만 늘려주면 여러 프로세스를 돌릴수 있다.
API Token 생성시 7,500건이라는 한정된 메세지를 보낼수 있다.
그이상 필요하다면 결재를 해야된다.
PushOver Python샘플소스(Python 2.x)
import httplib, urllib
conn = httplib.HTTPSConnection("api.pushover.net:443")
conn.request("POST", "/1/messages.json",
urllib.urlencode({
"token": "APP_TOKEN",
"user": "USER_KEY",
"message": "hello world",
}), { "Content-type": "application/x-www-form-urlencoded" })
conn.getresponse()
PushOver Python샘플소스(Python 3.x)
import http.client, urllib
conn = http.client.HTTPSConnection("api.pushover.net:443")
conn.request("POST", "/1/messages.json",
urllib.parse.urlencode({
"token": "APP_TOKEN",
"user": "USER_KEY",
"message": "hello world",
}), { "Content-type": "application/x-www-form-urlencoded" })
conn.getresponse()
https://pushover.net/faq#library-python
mdadm-check.py
#!/usr/bin/env python
import argparse
import logging
import subprocess
import httplib
import urllib
logging.basicConfig()
LOGGER = logging.getLogger('logger')
LOGGER.setLevel(logging.INFO)
PO_MSG_ENDPOINT = "/1/messages.json"
def mdadm_check(args):
for array in args.arrays:
LOGGER.info('Checking array ' + array)
cmd = "/sbin/mdadm --detail " + array + " | awk '/Failed Devices : / {print $4;}'"
check = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
failed_drives, err = check.communicate()
LOGGER.info('Found ' + failed_drives + ' failed drives, sending Pushover msg')
if int(failed_drives) != 0:
priority = 1
message = "CRITICAL: There are {} failed drives in {}".format(failed_drives, array)
post_to_pushover(args.token, args.key, str(priority), message)
elif int(failed_drives) == 0:
priority = -1
message = "INFO: There are {} failed drives in {}".format(failed_drives, array)
post_to_pushover(args.token, args.key, str(priority), message)
def post_to_pushover(token, key, priority, msg):
try:
LOGGER.info('Opening HTTPS connection to api.pushover.net...')
po_api = httplib.HTTPSConnection("api.pushover.net:443")
po_api.request("POST", PO_MSG_ENDPOINT,
urllib.urlencode({
"token": token,
"user": key,
"priority": priority,
"message": msg,
}), {"Content-type": "application/x-www-form-urlencoded"})
response = po_api.getresponse()
LOGGER.info("{}: {}".format(response.status, response.reason))
po_api.close()
except Exception as ex:
LOGGER.error('Could not connecto to Pushover: ' + str(ex))
if __name__ == '__main__':
PARSER = argparse.ArgumentParser(description='Simple software RAID health check tool using mdadm and Pushover.')
PARSER.add_argument('-a', '--array', dest='arrays', action='append', help='RAID array i.e /dev/md0', required=True)
PARSER.add_argument('-t', '--token', dest='token', help='Pushover App Token', required=True)
PARSER.add_argument('-k', '--key', dest='key', help='Pushover User Key', required=True)
ARGS = PARSER.parse_args()
mdadm_check(ARGS)
priority값이 1이면 스마트폰 소리알림, -1이면 무음
mdadm.sh (chmod 700 mdadm.sh)
#!/bin/bash
python mdadm-check.py --key=User Key값 --token=API Key값 --array=/dev/md0
--------------------------------------------------------------------------------
usage: mdadm-check.py [-h] -a ARRAYS -t TOKEN -k KEY
Simple software RAID health check tool using mdadm and Pushover.
optional arguments:
-h, --help show this help message and exit
-a ARRAYS, --array ARRAYS
RAID array i.e /dev/md0
-t TOKEN, --token TOKEN
Pushover App Token
-k KEY, --key KEY Pushover User Key
--------------------------------------------------------------------------------
crontab 등록 (테스트로 매시간 실행)
# crontab -e
00 * * * * /root/mdadm.sh >> /root/cron.log 2>&1
shell실행시 출력되는 문자열을 cron.log에 쌓이도록 한다.
이렇게 하지 않으면 스케쥴이 실행할때마다 root메일로 쌓인다.
스마트폰 테스트
정상적으로 메세지가 오는것을 확인할수 있다.
'Linux > Python' 카테고리의 다른 글
simple python daemon (0) | 2021.11.01 |
---|---|
pid handle (0) | 2021.10.31 |
Python argument vscode debug (0) | 2021.10.30 |
Python socket(Ping3, Ping) 관련 Permisson Error 해결 (0) | 2021.10.26 |