设计思路:
1、将基线配置,按照对比的模块划分为列表,比如:
acl_2997=[‘acl basic 2197’, ’ rule 1 permit vpn-instance mgmt source 1.1.1.1 0’, ’ rule 5 permit vpn-instance mgmt source 2.2.2.2 0’, ’ rule 10 permit source 3.3.3.3 0’]
ospf_1=[“ospf 1”]
2、登录设备,收集需要对比设备的配置信息。
3、将收集的配置信息转换为列表。
4、使用基线配置内容对来将当前配置信息进行切片。
5、将基线配置与切片配置进行差集计算,确认多的配置和少的配置。
from netmiko import ConnectHandler
import netmiko
from jixian import acl_2997
from jixian import ospf_1
with open("ip_pool", "r", encoding="utf-8") as ip_pool:
for ip in ip_pool:
with open("{ip}_logfile.log".format(ip=ip), "a", encoding="utf-8") as logfile:
ip = ip.strip()
try:
ip = ip.strip()
device = {
'device_type': 'hp_comware',
'host': ip,
'username': 'admin',
'password': 'admin',
}
net_connect = ConnectHandler(**device)
sshConfirm = net_connect.find_prompt()
logfile.write('设备{sshConfirm}地址{ip}已成功登录 \n'.format(sshConfirm=sshConfirm, ip=ip))
print('设备{sshConfirm}地址{ip}已成功登录 '.format(sshConfirm=sshConfirm, ip=ip))
def compare(cmd):
cu_config = net_connect.send_command("dis cu")
#收集当前配置
cu_config_list = cu_config.splitlines()
#当前配置变为列表
if cmd[0] not in cu_config_list:
#判断命令是否存在,不存在则直接报错
logfile.write("设备{sshConfirm}({ip})命令{cmd}不存在。\n".format(sshConfirm=sshConfirm,ip=ip,cmd=cmd[0]))
print("设备{sshConfirm}({ip})命令{cmd}不存在。\n".format(sshConfirm=sshConfirm,ip=ip,cmd=cmd[0]))
else:
num_start = cu_config_list.index(cmd[0])
#定义对比命令的开始下标
#print(num_start,type(num_start))
if cmd[-1] not in cu_config_list:
print("设备{sshConfirm}({ip})命令{cmd}配置不完整,请检查{cmd}配置。\n".format(sshConfirm=sshConfirm,ip=ip,cmd=cmd[0]))
logfile.write("设备{sshConfirm}({ip})命令{cmd}配置不完整,请检查配置。\n".format(sshConfirm=sshConfirm,ip=ip,cmd=cmd[0]))
else:
num_end = cu_config_list.index(cmd[-1]) + 1
#定义对比命令结束下标
#print(num_end,type(num_end))
if num_start+1==num_end:
#这个是定义只有一行命令的检查项
compare_list=cmd
#print(compare_list)
else:
compare_list = cu_config_list[num_start:num_end]
#有多行命令的检查项,将当前配置要对比的命令修进行截取列表
#print(compare_list)
compare_loss = list(set(cmd).difference(set(compare_list)))
#基线配置与当前配置的差集,确定缺少的命令
#print(compare_loss)
compare_more = list(set(compare_list).difference(cmd))
#当前命令与基线配置的差集,确定当前配置多余的命令。
#print(compare_more)
if len(compare_loss)==0 and len(compare_more) ==0:
print("设备{sshConfirm}({ip}),配置命令{cmd}正确。\n".format(sshConfirm=sshConfirm,ip=ip,cmd=cmd[0]))
logfile.write("设备{sshConfirm}({ip}),配置命令{cmd}正确。\n".format(sshConfirm=sshConfirm,ip=ip,cmd=cmd[0]))
else:
print("设备{sshConfirm}({ip}),配置命令{cmd}不正确:\n".format(sshConfirm=sshConfirm,ip=ip,cmd=cmd[0]))
print("当前配置缺少命令{compare_loss}。\n".format(compare_loss=compare_loss))
print("当前配置多了命令{compare_more}。\n".format(compare_more=compare_more))
logfile.write("设备{sshConfirm}({ip}),配置命令{cmd}不正确:\n".format(sshConfirm=sshConfirm,ip=ip,cmd=cmd[0]))
logfile.write("当前配置缺少命令{compare_loss}。\n".format(compare_loss=compare_loss))
logfile.write("当前配置多了命令{compare_more}。\n".format(compare_more=compare_more))
compare(acl_2997)
compare(ospf_1)
except Exception as e:
print("Error:",e)
logfile.write("Error:{e}".format(e=e))