配置思路:
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)