自动化日常巡检程序-Python实现

程序说明

程序是通过使用python实现ssh连接到服务器去实行shell脚本,返回数据,并且生成excel,对不正常指标进行标红处理。

Python要实现ssh连接服务器还需要其他模块。

python-2.7.5、paramiko-1.15.2、xlwt-1.0.0

程序流程

daily check

由于这边是在windows下面执行的,下面我将改成在linux系统下面执行

程序结构与程序说明

此程序由主程序、主机信息文件、命令文件三个文件组成。

` daily_check.py <此文件是python的主程序
` 日期ycq.txt <生成的巡检信息文件
` check.log <日志文件
| hosts <存放着要执行那些命令和检查那些主机的文件
|     ` host.info <存放着需要巡检的主机IP和用户名密码
|     `xx.xx.xx.xx.sh<–脚本文件生成下面的文件
|     ` xx.xx.xx.xx.cmd <存放相关主机需要执行的命令
执行了daily_check.py生成了xunjian.txt文件,我们需要将文件的内容都拷贝到一个excel文件中查看。

并标出相关的预警的信息。如下:

daily check上图显示了5列:

  • 项目:检查了什么。
  • 命令:检查使用的命令。
  • 基线:比对的标准。
  • 巡检情况:检查出来的信息。
  • 主机:是在那台主机上检查的。
    • *.cmd文件

    此文件存放了巡检需要执行的命令、校验标准和命令是检查什么项目的,如下图:

    daily check
  • 以上文件的每一行分为3个部分:
    • 校验项目。
    • 校验shell命令。
    • 校验标准:校验标准指定一个操作符号(>、<、=),具体用途例如:<85% 如果检查出来的结果 >85%就超标了。

    以上三个部分是使用 “#” 分割(注意:请在命令中避免使用 “#”,以免出现程序分割错误)。

    host.info文件

    此文件中存放了需要巡检的主机的IP和用户名信息,它们使用空格分开,如果有不需要巡检的主机可以在里面使用 (#) 在注释,和shell脚本的注释是一样的。如图:

    daily check

如果有行的服务器需要巡检,需要添加相关 主机 信息到此文件中。

执行巡检先要执行xx.xx.xx.xx.sh脚本,生产xx.xx.xx.xx.cmd,然后再执行主程序daliy_check.py,现将脚本贴到下面:
1.主程序:daliy_check.py
#!/bin/env python
# -*- coding:utf-8 -*-

# program: ssh remote execute command
#          genaral data story local
# author: ycq
# date: 2017-08-18

import sys
import paramiko
import xlwt
import time
from datetime import datetime
import logging

logging.basicConfig(level=logging.INFO,
format=’%(asctime)s %(name)-12s %(levelname)-8s %(message)s’,
filename=’check.log’,
filemode=’w’,
datefmt=’%Y-%m-%d %X’)
reload(sys)
ISOTIMEFORMAT=’%Y-%m-%d’
sys.setdefaultencoding(‘utf-8’)

def header(work_sheet):
work_sheet.write(0, 0, ‘检查项目’, style0)
work_sheet.write(0, 1, ‘命令’, style0)
work_sheet.write(0, 2, ‘基准’, style0)
work_sheet.write(0, 3, ‘检查结果’, style0)
work_sheet.write(0, 4, ‘检查主机’, style0)
logging.info(‘header add ok!’)
return work_sheet

def run_host_sh(host, port, username, password, work_sheet):
ssh = paramiko.SSHClient()
command_file = open(‘./hosts/’ + host + ‘.cmd’, ‘r’)

for line in command_file.readlines():
rows = len(work_sheet.rows)
line = line.strip(‘\n’)
items = line.split(‘:’)

check_type = items[0].decode(‘utf-8’).encode(‘utf-8’)
check_cmd = items[1].decode(‘gbk’).encode(‘utf-8’)
check_base_line = items[2].decode(‘gbk’).encode(‘utf-8’)
opration = check_base_line[0:1]
base_value = check_base_line[1:]

work_sheet.write(rows, 0, check_type)
work_sheet.write(rows, 1, check_cmd)
work_sheet.write(rows, 2, check_base_line)

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(host, port, username, password, key_filename=None, timeout=2)
except Exception, e:
logging.error(‘can not connect host: ‘ + host)
logging.error(‘command can not exec: ‘ + check_cmd)
logging.error(e)
continue
stdin, stdout, stderr = ssh.exec_command(check_cmd)
return_info = stdout.read().strip()

style_red = xlwt.easyxf(‘pattern: pattern solid, fore_colour red;’ +
‘font: name Times New Roman, color-index black, bold on;’ +
‘borders: left thick, right thick, top thick, bottom thick;’ +
‘align: horiz center’)

error_flag = False

if opration == ‘>’:
if str(base_value) > str(return_info):
error_flag = True
elif opration == ‘=’:
if str(return_info) != str(base_value):
error_flag = True
elif opration == ‘<‘:
if str(base_value) < str(return_info):
error_flag = True

if error_flag:
logging.warning(host + ‘ checked diff’)
logging.warning(‘command is: ‘ + check_cmd)
work_sheet.write(rows, 3, return_info.decode(‘gbk’).encode(‘utf-8’), style_red)
else:
work_sheet.write(rows, 3, return_info.decode(‘gbk’).encode(‘utf-8’))

work_sheet.write(rows, 4, ‘server IP: ‘ + host)

check_info = check_type + ‘\t’ + check_cmd + ‘\t’ + check_base_line + ‘\t’ + return_info
check_info = check_info.strip(‘\n’)
check_info += ‘\t’ + ‘server IP: ‘ + host
logging.info(check_info)
command_file.close()
ssh.close()
return work_sheet

if __name__==’__main__’:
#   try:
#     main()
#   except Exception,e:
#     print e

style0 = xlwt.easyxf(‘pattern: pattern solid, fore_colour yellow;’ +
‘font: name Times New Roman, color-index black, bold on;’ +
‘borders: left thick, right thick, top thick, bottom thick;’ +
‘align: horiz center’,
num_format_str=’0,000.00′)

work_book = xlwt.Workbook(encoding=’utf-8′)
work_sheet = work_book.add_sheet(‘A Test Sheet’)
work_sheet = header(work_sheet)

hosts_file = open(‘./hosts/host.info’, ‘r’)

for line in hosts_file.readlines():
if line[0:1] == ‘#’: continue
line = line.strip(‘\n’)
items = line.split()
port = 22
host = items[0]
username = items[1]
password = items[2]

work_sheet = run_host_sh(host, port, username, password, work_sheet)
logging.info(host + ‘ check finish !\n’)
file_pre = time.strftime(ISOTIMEFORMAT, time.localtime(time.time()))
work_book.save(file_pre + ‘_ycq.xls’)

2.host.info
xx.xx.xx.xx user passwd
3.xx.xx.xx.xx.sh
#!/bin/bash
disk=$(df -lP | grep -e ‘/alidata1$’ | awk ‘{print $5}’)
echo -e 磁盘空间:$disk:”<85%” > 10.14.12.20.cmd
used_free=$(free -m | sed -n ‘2p’ | awk ‘{printf(“%d%\n”,$3/$2*100)}’)
echo -e 已使用内存:$used_free:”<10%” >> 10.14.12.20.cmd

发表评论

电子邮件地址不会被公开。 必填项已用*标注