H3C设备通过LLDP进行自动添加设备描述

配置思路:
1、我们还是使用netmiko模块去进行设备信息的采集和配置的下发
2、还是在脚本执行目录下创建一个ip_pool的文件,用于存放要进行配置的设备地址信息
3、收集设备的lldp信息,并存储到一个相应的文本文档。
4、lldp信息的前三行是没有用的信息,我们可以通过一个for循环,自动过滤掉前三行
5、第四行说明lldp每一列的排列信息,其中H3C设备lldp信息分为两种,
一种列的表示形式为:
“System Name” 、“ Local Interface”、“ Chassis ID” 、“ Port ID”,
另外一种的表现实行为:
“ Local Interface”、“ Chassis ID” 、“ Port ID”、“System Name”
这个时候,我们需要将这一行进行列表切割,通过列表的值进行判断具体是哪种形式,以便为后续形成的字典中的值都的数据表现都是一样的【代码中36–41行】
6、由于H3C设备的系统名称可能会换行,所以要对部分换行的系统名称进行拼接。【代码中42到50行】
7、再进行设备的接口描述配置的时候,我们可以先预定义一些列表,其中每一个列表都是存储着具有相同属性(这些属性是你自己定义的,便于后面添加描述),比如我这边定义了一个dev_info,他的共同属性是N0,所以我再添加描述的时候使用des PRE_[N0:{devname}:{port}]


from netmiko import ConnectHandler
import datetime
cu_time =datetime.datetime.now().strftime('%Y-%m-%d-%H:%M:%S')
with open("ip_pool", "r", encoding="utf-8") as ip_pool:
    for ip in ip_pool:
        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()
            print('设备{sshConfirm}({ip})已成功登录 \n'.format(sshConfirm=sshConfirm, ip=ip))

            def lldp():
                sysname_dict={}
                #存储LLDP信息
                for index, line in enumerate(lldp_file):
                    #获取LLDP信息
                    if index ==3:
                        name_list=line.split()
                    elif index < 3:
                        pass
                    #去除lldp开始的信息
                    else:
                    #这些都是lldp的邻居信息
                        line_list = line.split()
                    #将每一行的信息进行列表切分。
                        if len(line_list) > 1:
                        # 如果列表长度大于1,则表示此行包含lldp的所有信息
                            if name_list[0]=="System":
                        #不同型号设备,lldp每列的顺序不同。总体分为两种,通过name_list的第一个值来区分是哪一种。
                                sysname_dict[index] = [line_list[0], line_list[1], line_list[3]]
                    #字典中增加相应的内容,其中key使用index值表示,value使用列表,列表中包含队短系统名称,本端接口名称,对端接口名称。
                            elif name_list[0]=="Local":
                                sysname_dict[index]=[line_list[3], line_list[0], line_list[2]]
                        else:
                    # 如果列表长度小于1,则代表此行是上一行的系统名称没表示完导致的。
                            if index - 1 in sysname_dict.keys():
                                #正常情况下,设备描述不会超过三行,如果设备描述是两行的话,匹配此处
                                sysname_dict[index - 1][0] = sysname_dict[index - 1][0] + line_list[0]
                                # 将上一行的系统名称与本行显示的内容进行拼接,则此为上一行的系统名称。
                            else:
                                #如果设备描述是三行的话,匹配此处,如果设备描述是四行,可以再增加一个elif。
                                sysname_dict[index - 2][0] = sysname_dict[index - 2][0] + line_list[0]
                #print(sysname_dict)
                return sysname_dict
            def lldp_write(lldp_dict):
                dev_info=["S6800","S5560X","F5080","L5080","9804","M9006","SR8803","MSR810","S5560","S10506","SR8806","MSR3610","F5020","F5030"]
                #定义我们有的设备类型,为区分LLDP对端是我们自己的网络设备做对比
                for key in lldp_dict:
                    sysname=lldp_dict[key][0].split("-")
                    #将系统名称进行拆分列表,然后根据对端系统名称的关键字,确认需要给描述信息打上哪个关键字。
                    for dev in dev_info:
                        if dev in sysname:
                            #如果LLDP显示的系统名称与预定义的名称相同,则是我们自己的设备,则进行接口描述下发。
                            commands=["int {interface}".format(interface=lldp_dict[key][1]),"des PRE_[N0:{devname}:{port}]".format(devname=lldp_dict[key][0],port=lldp_dict[key][2])]
                            input=net_connect.send_config_set(commands)



            with open("{ip}_lldp".format(ip=ip),"w",encoding="utf-8") as lldp_file:
                #将LLDP的信息写入文件     
                lldp_info=net_connect.send_command("dis lldp neighbor-information list")
                lldp_file.write(lldp_info)
			with open("{ip}_lldp".format(ip=ip), "r", encoding="utf-8") as lldp_file:
			    #读取文件信息,并进行配置
                lldp_dict=lldp()
                #获取设备lldp信息
                lldp_write(lldp_dict)
                #对设备接口进行配置。


        except Exception as e:
            print("Error:", e)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值