频道栏目
首页 > 资讯 > 云计算 > 正文

利用shell+python来实现定时服务器巡检报告

19-03-02        来源:[db:作者]  
收藏   我要投稿

脚本用途描述:总共分为三个脚本,第一个脚本是check.sh 主要是用途是从公司的zabbix服务器上面获取相关服务器的监控指标(包括服务器CPU 内存 磁盘 网络 NAS挂载信息 TCP连接信息 ping主机信息 IP 主机名等信息),然后创建一个mysql的库,创建一个数据表。将脚本获取的数据写入到mysql表;

第二个是python脚本,主要的用途是连接数据库,使用python的MySQLdb模块读取数据库信息,然后将数据库的表通过python的pandas模块来实现转换成excel文件;

第三个是python脚本,主要用途是发邮件,python有专门的发邮件模块smtplib;

第四个是利用linux的crontab来实现定时发送巡检邮件;

第一个脚本内容:

vim check.sh

#!/bin/bash

#

#数据库连接:

db_con()

{

localsql="/usr/bin/mysql -h1.1.1.1 -ustone -p222222 -N -B dddddd"

}

db_con

ip_array=(

1.1.1.219

1.1.1.218

1.1.1.217

1.1.1.216

1.1.1.215

1.1.1.214

1.1.1.213

1.1.1.212

1.1.1.211

1.1.1.220

1.1.1.221

1.1.1.225

1.1.1.224

1.1.1.222

1.1.1.32

1.1.1.31

1.1.1.5

1.1.1.2

1.1.1.33

1.1.1.34

1.1.1.1

1.1.8.179

1.1.8.183

1.1.8.181

1.1.8.3

1.1.1.108

1.1.8.1

1.1.8.184

1.1.8.185

1.1.8.191

1.1.8.182

1.1.8.190

1.1.8.188

1.1.8.186

1.1.8.187

1.1.1.109

1.1.1.110

1.1.1.25

1.1.1.18

1.1.1.24

1.1.1.19

1.1.1.17

1.1.1.16

1.1.1.27

1.1.1.28

1.1.1.36

1.1.1.35

1.1.1.26

1.1.1.29

1.1.1.4

1.1.1.30

1.1.1.23

1.1.1.65

1.1.1.66

1.1.1.67

1.1.1.22

1.1.1.160

1.1.1.158

1.1.1.159

1.1.2.34

1.1.2.35

1.1.2.40

1.1.2.41

1.1.2.42

1.1.2.39

1.1.2.38

1.1.2.36

1.1.2.37

1.1.0.92

1.1.0.91

1.1.20.184

1.1.20.185

1.1.20.186

1.1.20.182

1.1.20.183

1.1.20.180

1.1.20.181

1.1.20.187

1.1.20.188

1.1.0.89

1.1.0.90

1.1.0.223

1.1.1.10

1.1.20.136

1.1.20.137

1.1.20.172

)

for ((i=0;i<${#ip_array[@]};i++))

do

hostname=$(zabbix_get -s ${ip_array[i]} -p 10050 -k 'agent.hostname')

cpu_free=$(zabbix_get -s ${ip_array[i]} -p 10050 -k 'system.cpu.util[,idle]')

echo $cpu_use

cpu_load=$(zabbix_get -s ${ip_array[i]} -p 10050 -k 'system.cpu.load[all,avg15]')

mem_total=$(zabbix_get -s ${ip_array[i]} -p 10050 -k 'vm.memory.size[total]')

mem_free=$(zabbix_get -s ${ip_array[i]} -p 10050 -k 'vm.memory.size[available]')

mem_use=`echo "$[${mem_total}-${mem_free}]/1024/1024/100"|bc`

disk_free=$(zabbix_get -s ${ip_array[i]} -p 10050 -k 'vfs.fs.size[/,pfree]')

disk_use=`echo "100-${disk_free}"|bc`

if [ $(echo ${ip_array[i]} | grep 1.1.8|wc -l) -eq 1 ];then

nas_mount=$(zabbix_get -s ${ip_array[i]} -p 10050 -k 'sls_mount[123456.cn-sz.tx.com]')

elif [ $(echo ${ip_array[i]} | grep 1.1.1|wc -l) -eq 1 ];then

nas_mount=$(zabbix_get -s ${ip_array[i]} -p 10050 -k 'sls_mount[653212cn-sz.tx.com]')

elif [ $(echo ${ip_array[i]} | egrep '^1.1|^1.1' |wc -l) -eq 1 ];then

nas_mount=0

fi

if [ ${nas_mount} -eq 1 ];then

nas_mount2="NAS Mount is ok"

else

nas_mount2="Not NAS Mount"

fi

host_ping=$(zabbix_get -s ${ip_array[i]} -p 10050 -k 'agent.ping')

if [ ${host_ping} -eq 1 ];then

host_ping2="ping is ok"

else

host_ping2="ping is fail"

fi

TCP_TIME_WAIT=$(zabbix_get -s ${ip_array[i]} -p 10050 -k 'linux_status[tcp_status,TIME-WAIT]')

TCP_ESTABLISHED=$(zabbix_get -s ${ip_array[i]} -p 10050 -k 'linux_status[tcp_status,ESTAB]')

free_inode_percent=$(zabbix_get -s ${ip_array[i]} -p 10050 -k 'vfs.fs.inode[/,pfree]')

operation="gaoyang"

now=`date "+%Y-%m-%d,%H:%M:%S"`

$localsql -e "insert into sys_check(date,serverip,hostname,operation,cpu_free_percent,cpu_load,mem_used_percent,disk_used_percent,nas_mount_status,host_ping_status,TCP_TIME_WAIT_NUMBER,TCP_ESTABLISHED,free_inode_percent)values('${now}','${ip_array[i]}','${hostname}','${operation}','${cpu_free}%','${cpu_load}','${mem_use}%','${disk_use}%','${nas_mount2}','${host_ping2}','${TCP_TIME_WAIT}','${TCP_ESTABLISHED}','${free_inode_percent}%')"

done

第二个脚本内容:

vim ExportData.py

# -*- coding: utf-8 -*-

"""

Created on Fri Feb 9 17:21:39 2018

func:查询Mysql结果,生成excel文件,发送到指定邮箱

@author:@DGDSFFGF

"""

import pandas as pd

import MySQLdb

import datetime

from email import encoders

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

from email.mime.base import MIMEBase

import smtplib

import re

# 设置全局公共参数PGMname

PGMname = 'PGM:python_learning_send_email'

# 返回sql语句查询结果

def fetch_db(sql):

"""

fetch_db,创建数据库连接,执行sql语句查询结果

"""

# user,passwd,db参数需要自行配置

db_user = MySQLdb.connect(host='1.2.3.4',port=3306,charset='utf8',

user='aaa',passwd='bbbbbb',db='ddfsdfsdf')

cursor = db_user.cursor()

cursor.execute("SET NAMES utf8;")

cursor.execute(sql)

result = cursor.fetchall()

db_user.close()

print "OK!!! Result Type is:",type(result)

return result

# 将sql执行查询结果生成到excel文件

def gen_xls(res,col,filename):

"""

gen_xls,将数据库查询结果生成excel文件

"""

file_name = filename + datetime.datetime.now().strftime("%Y-%m-%d") + ".xlsx"

# from_records方法要求使用列表类型作为数据源,这里需要强制转换

if type(res) is not list:

res = list(res)

# from_records方法columns参数的作用是设置数据的列名,影响head行

df = pd.DataFrame.from_records(data=res,columns=col)

# 输出到excel表格里面

df.to_excel(file_name,"Sheet1",index=True,header=True)

print "OK!!! Filename is:",file_name

return file_name

# 监控sql语句

xjsql = "(select * from sys_check where operation='gaoyang')"

# 待查询库表的列名,匹配sys_check库表的列名

col = ['ID','时间','服务器IP','主机名','CPU空闲使用率','运维人员','CPU负载','内存使用率','磁盘使用率','NAS挂载状态','PING状态','TCP超时连接数','TCP正常连接数','文件系统INODE空闲百分比']

# 查询数据库

xjdkres = fetch_db(xjsql)

xjfilename = '巡检报表-'

# 将结果传给文件参数

gen_xls(xjdkres,col,xjfilename)

第三个脚本:

# -*- coding: utf-8 -*-

"""

Created on Fri Feb 9 17:21:39 2018

func:查询Mysql结果,生成excel文件,发送到指定邮箱

@author:@gaoyang

"""

import pandas as pd

import MySQLdb

import datetime

from email import encoders

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

from email.mime.base import MIMEBase

import smtplib

import re

# 设置全局公共参数PGMname

PGMname = 'PGM:python_learning_send_email'

# 将生成的excel文件发送给指定邮箱

def sendmsg(f_email,f_pwd,to_list,smtp_server,sendfile):

"""

sendmsg,使用smtplib发送邮件,这里使用网易邮箱作为发送方

"""

sub = '每天定时发送监控邮件'

content = 'hi 本邮件是每天定时监控附件,请查收谢谢!'

# 邮件对象

msg = MIMEMultipart()

msg['From'] = f_email

msg['Subject'] = sub

to_str = ''

for x in to_list:

to_str += x + ','

# msg['To']接收的参数是str而不是list或tuple,多个地址使用逗号隔开

msg['To'] = to_str

# 邮件正文是MIMEText

msg.attach(MIMEText(content,'plain','utf-8'))

with open(sendfile,'rb') as fp:

# 设置附件的MIME类型,这里使用xls类型,application/octet-stream表示附件是下载格式

mime = MIMEBase('application/octet-stream', 'xlsx', filename='巡检报表 + datetime.datetime.now().strftime("%Y-%m-%d") + ".xlsx"')

# 添加头信息

mime.add_header('Content-Disposition', 'attachment', filename='巡检报表 + datetime.datetime.now().strftime("%Y-%m-%d") + ".xlsx"')

mime.add_header('Content-ID', '<0>')

mime.add_header('X-Attachment-Id', '0')

# 将附件内容读取为数据流

mime.set_payload(fp.read())

# 用Base64编码

encoders.encode_base64(mime)

# 添加到MIMEMultipart

msg.attach(mime)

try:

server = smtplib.SMTP()

# set_debuglevel参数设为0不打印log;设为1打印log

server.set_debuglevel(1)

server.connect(smtp_server,25)

server.starttls()

server.login(f_email,f_pwd)

server.sendmail(f_email,to_list,msg.as_string())

server.quit()

print PGMname + ":" + "sendmsg" + ":" + "Send Email OK!"

except Exception as e:

print PGMname + ":" + "sendmsg" + ":" + "Exception!",e

# 接收邮件用户列表,换成你自己的邮箱地址

to_email = ['aas@qq.com']

from_email = 'bbb@qq.com'

from_email_pwd = 'ggggggg'

xlsfile = 巡检报表 + datetime.datetime.now().strftime("%Y-%m-%d") + ".xlsx"

smtp_server = 'smtp.exmail.qq.com'

# 发送邮件

sendmsg(from_email,from_email_pwd,to_email,smtp_server,xlsfile)

最后一步crontab -e 修改crontab

00 09 * * * sh /.scripts/check.sh && python /.scripts/ExportData.py && python /.scripts/sendMail.py

相关TAG标签
上一篇:新研究推测第九大行星存在于太阳系边缘 或将很快被发现
下一篇:Google Chrome被发现零日漏洞 可让黑客获取用户数据
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站