先上代码:
第一个代码片段是用来收集升级设备前后要对比的信息的:
```python
from netmiko import ConnectHandler
import logging
import time
import os
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='/var/log/netopslog/txt_compare.log',
filemode='a')
logdir='/var/log/netopslog/%s'%(time.strftime('%Y-%m-%d'))
print(logdir)
logdirExist = os.path.exists(logdir)
def info_gathering(ip):
#定义信息收集的函数,我们通过netmiko来进行设备的登录
try:
ip = ip.strip()
device = {
'device_type': 'hp_comware',
'host': ip,
'username': username,
'password': password,
}
net_connect = ConnectHandler(**device)
sshConfirm = net_connect.find_prompt().lstrip('<').rstrip('>')
screen_disable = net_connect.send_command_timing('screen-length disable')
#执行screen_disable ,输出命令后,甭管输出是多少,都会进行一屏幕展示,避免出现程序卡死
with open('cmd_dir/info_gathering_cmd.txt','r',encoding='utf-8') as f:
#其中info_gathering_cmd是我们要进行收集信息的命令的文件,每个收集命令占一行中即可
cmd_list=f.readlines()
#将命令列表化
#print(cmd_list)
out1=net_connect.send_config_set(cmd_list)
#收集输入命令输出的信息
with open('%s/%s_%s'%(logdir,sshConfirm,time.strftime('%H:%M:%S')),'w',encoding='utf-8') as f:
f.write(out1)
#将输出的信息保存到文件,文件我们以设备名称+时间来命名
except Exception as e:
print(e)
#logging.ERROR(e)
if __name__ == "__main__":
if not logdirExist:
#判断我们要存储的目录是否存在,不存在就创建
os.mkdir(logdir, 0o755)
username = 'admin'
password = 'admin'
#登录设备的用户密码
ip_input=input("请输入IP地址,多个地址请用空格分开:")
#程序开始后,我们输入要收集设备信息的IP地址
ip_list=ip_input.split()
#print(ip_list)
for ip in ip_list:
info_gathering(ip)
#进行每个设的信息收集
``
对升级前后的设备进行信息收集,不同之处的对比脚本为:
import sys
import difflib
import time
logdir='/var/log/netopslog/%s'%(time.strftime('%Y-%m-%d'))
#配置对比文件输出的目录
def read_file(file_name):
#读取文件喊出,并将读取的值返回
try:
file_handle = open(file_name, 'r')
text = file_handle.read().splitlines() # 读取后以行进行分割
file_handle.close()
return text
except IOError as error:
print
'Read file Error: {0}'.format(error)
sys.exit()
# 比较两个文件并输出html格式的结果
def compare_file(file1_name, file2_name):
if file1_name == "" or file2_name == "":
print
('文件路径不能为空:file1_name的路径为:{0}, file2_name的路径为:{1} .'.format(file1_name, file2_name))
sys.exit()
file1_name=logdir+'/'+file1_name
file2_name = logdir + '/' + file2_name
text1_lines = read_file(file1_name)
text2_lines = read_file(file2_name)
diff = difflib.HtmlDiff() # 创建htmldiff 对象
result = diff.make_file(text1_lines, text2_lines) # 通过make_file 方法输出 html 格式的对比结果
# 将结果保存到result.html文件中并打开
try:
with open('%s/%s_comp_%s_result.html'%(logdir,file1_name.split('/')
[-1],file2_name.split('/')[-1]), 'w') as result_file:
# 同 f = open('result.html', 'w') 打开或创建一个result.html文件
result_file.write(result) # 同 f.write(result)
except IOError as error:
print('写入html文件错误:{0}'.format(error))
if __name__ == "__main__":
input=input("请出入对比文件名称,并以空格分开:")
file_list=input.split()
compare_file(file_list[0],file_list[1])