学习python的初衷便是希望通过python,写点自动运维的程序,替代我工作中的日常巡检。
初学python,很多东西都没有掌握,花了一个星期,磕磕绊绊的写了点基于linux的简单监控,本想接着写点windows的监控,觉得有点意兴阑珊,只好期待下周能再接再厉了。
写的有点乱,都是以函数来实现功能,期待对python熟练后可以优化代码。
#!/usr/bin/python
#author:killvoon
import paramiko
import psutil
import cx_Oracle
import smtplib
from email.mime.text import MIMEText
from email.header import Header
##定义主机列表(先只弄linux)
linux=['192.168.95.223','192.168.95.222']
def connectHost(ip,uname='root',passwd='oracle'):
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,username=uname,password=passwd)
return ssh
def MainCheck():
#查看linux文件系统使用率
#建立主机连接
for a in range(len(linux)):
try:
ssh=connectHost(linux[a])
#查看文件系统命令
cmd="df -h|sed '1d'|awk '{print $2\",\" $3\",\" $4\",\" $6\",\" $5}'"
stdin,stdout,stderr=ssh.exec_command(cmd)
filesystem_usage=stdout.readlines()
#查看系统时间
chk="date \"+%Y-%m-%d %H:%M:%S\""
stdin,stdout,stderr=ssh.exec_command(chk)
check_time=stdout.readlines()
check_time=check_time[0]
#查看主机名
hostname="hostname"
stdin,stdout,stderr=ssh.exec_command(hostname)
hostname=stdout.readlines()
hostname=hostname[0]
#循环列表,将文件系统使用率插入到数据库中
for i in range(len(filesystem_usage)):
list_1=filesystem_usage[i]
list_1=list(list_1.split(','))
#print(len(list_1))
sql='insert into filesys_usage values(\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',sysdate)' %(linux[a],hostname,list_1[0],list_1[1],list_1[2],list_1[3],list_1[4],check_time)
#print(sql)
db=connectDB()
sqlDML(sql,db)
#查看cpu使用率,并将信息写入到数据库中(取三次平均值)
cpu="vmstat 1 3|sed '1d'|sed '1d'|awk '{print $15}'"
stdin,stdout,stderr=ssh.exec_command(cpu)
cpu=stdout.readlines()
cpu_usage=str(round((100 - (int(cpu[0])+int(cpu[1])+int(cpu[2]))/3),2))+'%'
sql="insert into cpu_usage values('%s','%s','%s',sysdate)" %(linux[a],cpu_usage,check_time)
db=connectDB()
sqlDML(sql,db)
#查看内存使用率,并将信息写入到数据库中
mem="cat /proc/meminfo|sed -n '1,4p'|awk '{print $2}'"
stdin,stdout,stderr=ssh.exec_command(mem)
mem=stdout.readlines()
mem_total=round(int(mem[0])/1024)
mem_total_free=round(int(mem[1])/1024) + round(int(mem[2])/1024) +round(int(mem[3])/1024)
mem_usage=str(round(((mem_total-mem_total_free)/mem_total)*100,2))+"%"
sql="insert into mem_usage values('%s','%s','%s','%s','%s','%s','%s',sysdate)" %(linux[a],str(round(int(mem[0])/1024))+"M",str(round(int(mem[1])/1024))+"M",str(round(int(mem[2])/1024))+"M",str(round(int(mem[3])/1024))+"M",mem_usage,check_time)
db=connectDB()
sqlDML(sql,db)
except TimeoutError:
error='can not connect,please check server machine!'
sql='insert into error_report values(\'%s\',\'%s\',sysdate,\'%s\')' %(linux[a],check_time,error)
print("连接服务器 %s 异常" %(linux[a]))
db=connectDB()
sqlDML(sql,db)
sendMail()
continue
def connectDB(dbname='orcl'):
if dbname=='orcl':
connstr='system/king@192.168.95.223/orcl'
db=cx_Oracle.connect(connstr)
return db
def sqlDML(sql,db):
cr=db.cursor()
cr.execute(sql)
cr.close()
db.commit()
##定义邮件函数
def sendMail():
sender='xxxxxx@163.com'
receiver=['xxxx@qq.com','xxxx@qq.com']
subject="有监控报警邮件,请注意查收!"
smtpserver='smtp.163.com'
username='xxxxxxx@163.com'
password='xxxxxxxxxxxx'
msg=MIMEText('服务器连接出现问题!','plain','utf-8') ##plain 换成text后便发送不了邮件正文
msg['Subject'] =Header(subject,'utf-8')
smtp=smtplib.SMTP()
smtp.connect('smtp.163.com')
smtp.login(username,password)
smtp.sendmail(sender,receiver,msg.as_string())
smtp.quit()
if __name__=='__main__':
MainCheck()
上周忘了添加建表脚本,我使用的是oracle数据库,毕竟熟悉:
-----文件系统相关信息表
create table filesys_usage(ip varchar2(20),
hostname varchar2(50),
total_size varchar2(20),
used_size varchar2(20),
free_size varchar2(20),
filesys_name varchar2(100),
useage_percent varchar2(10),
check_time varchar2(40),
db_time date);
-----错误日志表
create table error_report(ip varchar2(20),
check_time varchar2(40),
db_time date,
error varchar2(1000));
-----cpu 使用率表
create table cpu_usage(ip varchar2(20),
cpu_used varchar2(10),
check_time varchar2(40),
db_time date);
------mem使用率表
create table mem_usage(ip varchar2(20),
mem_total varchar2(40),
mem_free varchar2(40),
buffers varchar2(40),
cached varchar2(40),
mem_used varchar2(10),
check_time varchar2(40),
db_time date
);