学习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/[email protected]/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='[email protected]' receiver=['[email protected]','[email protected]'] subject="有监控报警邮件,请注意查收!" smtpserver='smtp.163.com' username='[email protected]' 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 );