Python使用netmiko对网络设备进行基线对比

设计思路:
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))


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值