1、服务检查
#!/usr/bin/env python
# -*- coding:UTF-8 -*-
# description: auto check services status for running baibaoyun normally
# 当执行env python时,它其实会去env | grep PATH里(也就是 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)这几个路径里去依次查找名为python的可执行文件
import os
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
sys.path.append(os.path.dirname(os.path.abspath(sys.argv[0])))
import time
from collections import OrderedDict
import senddingding
if len(sys.argv[1:]) < 1:
print "参数传入错误."
exit(4)
hostname = sys.argv[1]
role=None
try:
role=sys.argv[2]
except Exception:
pass
server_bin_mapping = OrderedDict()
if role == 'db':
server_bin_mapping['MySQL'] = ['mysqld', '/etc/init.d/mysqld', '/etc/init.d/mysql']
elif role == 'web':
server_bin_mapping['Redis'] = ['redis-server', '/etc/init.d/Redis']
server_bin_mapping['Apache'] = ['httpd', '/etc/init.d/Apache', '/etc/init.d/httpd' ]
server_bin_mapping['Nginx'] = ['nginx', '/etc/init.d/Nginx', '/etc/init.d/nginx' ]
else:
server_bin_mapping['MySQL'] = ['mysqld', '/etc/init.d/mysqld', '/etc/init.d/mysql']
server_bin_mapping['Redis'] = ['redis-server', '/etc/init.d/Redis']
server_bin_mapping['Apache'] = ['httpd', '/etc/init.d/Apache', '/etc/init.d/httpd' ]
server_bin_mapping['Nginx'] = ['nginx', '/etc/init.d/Nginx', '/etc/init.d/nginx' ]
f = os.popen("ps -ef")
pslist = [ tuple(p.strip().split()) for p in f.readlines() ]
simple_ps = [ (p[1], ' '.join(p[7:])) for p in pslist]
f.close()
message = ["======== %s ======="%hostname, 'time: %s' %time.strftime('%Y-%m-%d %H:%M:%S')]
def start_server(server_name):
shs = server_bin_mapping[server_name][1:]
for sh in shs:
if os.path.isfile(sh) and os.access(sh, os.X_OK) and os.system("%s start" %sh) == 0:
message.append("%s服务尝试通过%s成功启动." %(server_name, sh))
return True
else:
message.append("%s服务尝试通过%s启动失败." %(server_name, sh))
message.append("%s服务不能启动.需要检查." %server_name)
return False
def stop_server(server_name):
shs = server_bin_mapping[server_name][1:]
for sh in shs:
if os.path.isfile(sh) and os.access(sh, os.X_OK) and os.system("%s stop" %sh) == 0:
message.append("%s服务通过%s停止成功." %(server_name, sh))
return True
else:
message.append("%s服务通过%s停止失败." %(server_name, sh))
message.append("%s服务停止失败, 请检查." %server_name)
return False
def check_alive(server_name):
bin_name=server_bin_mapping[server_name][0]
for item in simple_ps:
if item[1].find(bin_name) != -1:
#message.append("%s server is running." %server_name)
return True
message.append("%s服务没有运行." %server_name)
return False
for server in server_bin_mapping:
if not check_alive(server):
start_server(server)
message.append("###########################")
if len(message) > 3:
timestamp, sign = senddingding.get_sign_timestamp()
senddingding.send_msg(senddingding.access_token, sign, timestamp, '\n'.join(message))
2、发送消息(senddingding.py)
#!/usr/binm/env python
#encoding:utf-8
import os
import sys
import time
import hmac
import hashlib
import base64
import urllib
import json
try:
import requests
except ImportError as e:
print(e)
if os.system('pip install requests') == 0:
import requests
else:
exit(1)
secret = ''
access_token = ''
def get_sign_timestamp():
timestamp = int(round(time.time() * 1000))
secret_enc = bytes(secret).encode('utf-8')
string_to_sign = '%s\n%s'%(timestamp, secret)
string_to_sign_enc = bytes(string_to_sign).encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.quote_plus(base64.b64encode(hmac_code))
return timestamp, sign
def send_msg(access_token, sign, timestamp, msg):
url = "https://oapi.dingtalk.com/robot/send?access_token=%s&sign=%s×tamp=%s" %(access_token, sign, timestamp)
headers = {
'Content-Type': 'application/json;charset=utf-8'
}
data = {
'msgtype': 'text',
'text': {
'content': msg
}
}
response = requests.post(url, data=json.dumps(data), headers=headers)
if json.loads(response.text)['errmsg'] == 'ok':
return True
if __name__ == '__main__':
msg = sys.argv[1:]
if not msg:
print("错误: 消息为空")
sys.exit(-1)
timestamp, sign = get_sign_timestamp()
send_msg(access_token, sign, timestamp, msg)
3、定时任务调用
#每周一到周五,九点到18点执行一次
00 9-18 * * 1-5 /scripts/checkserver.py 192.168.1.1 web &> /dev/null