0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何通过Python脚本批量采集华为交换机配置

网络技术干货圈 来源:CSDN-煜成 2023-01-09 10:32 次阅读

实验目的

通过学习python网络运维自动化减少重复无意义的工作量,本次实验虽然只是一条命令,通过display current-configuration采集设备配置,但是在有大量设备需要采集配置文件时,又无相应的网管平台时,小而便捷的python成为了一种选择,而且可以python脚本可以根据需要自行增加需要的命令。

设备环境

通过ENSP模拟华为交换机,桥接云跟主机通信,SSH配置可达。
342fb0d2-8f22-11ed-bfe3-dac502259ad0.png
设备配置命令:

sysnameSW1
#不同设备IP不同,sysname不同,其他配置一致
interfaceVlanif1
ipaddress192.168.111.10255.255.255.0
#
aaa
local-useradminpasswordcipher

其余两台按这个模板配置
347852f6-8f22-11ed-bfe3-dac502259ad0.png
桥接云配置
完成设备配置后测试SSH连接是否正常
34ae705c-8f22-11ed-bfe3-dac502259ad0.png
通过CRT测试,三台设备都能正常登录

python环境

首先看一下项目的结构
34c7e7c6-8f22-11ed-bfe3-dac502259ad0.png

目录说明

backup_Script包是本次实验的主要代码,分为了三个模块来写的。

Dest目录是采集配置文件后保存的目录。

log是日志文件保存目录。

source是中存在一个entry_table.csv,这是填写登录IP跟用户名的。

34e6ebd0-8f22-11ed-bfe3-dac502259ad0.png

不能更改列数,更改IP跟用户名密码的时候,就按照这个来更改

requirements.txt里面内容是项目的依赖包及其对应版本号的信息列表,即项目依赖关系清单,其作用是用来重新构建项目所需要的运行环境依赖。

run.py作为本次实验的入口文件,在运行项目的时候就运行该文件

环境搭建

:版本Python 3.10.2
环境的搭建就从创建虚拟环境开始写,python安装之类的参考官方网站
35573ee4-8f22-11ed-bfe3-dac502259ad0.png
在最初项目的结构是这样的,然后进入到text目录下构建虚拟环境。

首先进入项目的目录,创建虚拟环境

#ven是可变的
python-mvenvven

35824666-8f22-11ed-bfe3-dac502259ad0.png
构建完成后在次查看目录,会发现目录中多了一个目录ven,这个ven就是所创建的虚拟环境。
35e2059c-8f22-11ed-bfe3-dac502259ad0.png
当然,虚拟环境创建好后不代表就结束了,还需要进入到虚拟环境中,称为激活虚拟环境

#通过该方法激活虚拟环境,激活后会有一个括号在前面
venScriptsactivate
#以下是激活后的显示
(ven)D:	ext>
#激活完成更新以下pip库
python.exe-mpipinstall--upgradepip
#安装所需依赖
pipinstall-rrequirements.txt
#通过入口文件启用
run.py

35f9aed6-8f22-11ed-bfe3-dac502259ad0.png
361d7a32-8f22-11ed-bfe3-dac502259ad0.png
从控制台输出的日志可以看出,脚本已经成功运行结束,那么查看一下相关的目录是否存在这文件
364b2054-8f22-11ed-bfe3-dac502259ad0.png
查看Dest目录,已经存在三个文件,打开看一下是否已经获取到内容
367e05be-8f22-11ed-bfe3-dac502259ad0.png
查看日志文件夹

36a4fe62-8f22-11ed-bfe3-dac502259ad0.png
也存在相关的日志

python源码分享

一、backup_Script包中的源码
_init_.py

from.Read_sourceimportlogin
from.Loggerimportlog
importparamiko
importtime
importsocket
importre
importsys

sys.path.append('backup_Script')
ssh_client=None
switch_with_authentication_issue=[]
switch_not_reachable=[]


deflogon_failed():
globalswitch_with_authentication_issue
globalswitch_not_reachable
ifswitch_with_authentication_issueandswitch_not_reachableisNone:
log.error('无登录失败记录')
else:
log.error('登录失败,详细查看文件log/switch_not_reachable.txt为不可达,switch_with_authentication_issue.txt为认证失败')
withopen('./log/switch_with_authentication_issue.txt','w')asf:
f.write('
'.join(switch_with_authentication_issue))
withopen('./log/switch_not_reachable.txt','w')asf:
f.write('
'.join(switch_not_reachable))


defrun():
globalssh_client
globalswitch_with_authentication_issue
globalswitch_not_reachable
ip_list=login.get_entry_ip()
name_list=login.get_entry_name()
passwd_list=login.get_entry_passwd()
regex='sysname.*'
foriinzip(ip_list[1:],name_list[1:],passwd_list[1:]):
ip=i[0]
name=i[1]
passwd=i[2]
try:
ssh_client=paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(
hostname=ip,
username=name,
password=passwd,
look_for_keys=False
)
print('连接成功:',ip)
command=ssh_client.invoke_shell()
command.send("screen-length0temporary
")
command.send("displaycurrent-configuration
")
time.sleep(2)
output=command.recv(65535)
print(output.decode('ascii'))
save_file=re.search(regex,output.decode('ascii')).group()
sw_name=save_file[8:].strip()
f=open(f"./Dest/{sw_name}.txt",'w')
f.write(output.decode(encoding='UTF-8'))
f.close()
exceptparamiko.ssh_exception.AuthenticationException:
log.critical(f"用户认证失败的{ip}.")
switch_with_authentication_issue.append(ip)
exceptsocket.error:
log.critical(f"{ip}不可达,请检查网络.")
switch_not_reachable.append(ip)
ssh_client.close()
logon_failed()

Logger.py

importlogging
importos


classLogger:
def__init__(self):
selfdef_fmt='%(asctime)s-%(funcName)s-%(levelname)s-%(message)s'
self.log_name=os.path.join('./log/Business.log')
self.logger=logging.getLogger('Sw_Script')
self.logger.setLevel(logging.DEBUG)
self.formatter=logging.Formatter(selfdef_fmt)

def__console(self,level,message):
fh=logging.FileHandler(self.log_name,'a',encoding='utf-8')
fh.setLevel(logging.DEBUG)
fh.setFormatter(self.formatter)
self.logger.addHandler(fh)

ch=logging.StreamHandler()#创建一个StreamHandler,用于输出到控制台
ch.setLevel(logging.DEBUG)
ch.setFormatter(self.formatter)
self.logger.addHandler(ch)

iflevel=='info':
self.logger.info(message)
eliflevel=='debug':
self.logger.debug(message)
eliflevel=='warning':
self.logger.warning(message)
eliflevel=='error':
self.logger.error(message)
eliflevel=='critical':
self.logger.critical(message)

self.logger.removeHandler(ch)
self.logger.removeHandler(fh)
fh.close()

defdebug(self,message):
self.__console('debug',message)

definfo(self,message):
self.__console('info',message)

defwarning(self,message):
self.__console('warning',message)

deferror(self,message):
self.__console('error',message)

defcritical(self,message):
self.__console('critical',message)


log=Logger()

Read_source.py

importcsv


classRead_date(object):
def__init__(self,path:str):
self._path=path

defget_entry_ip(self)->list[str]:
withopen(self._path)asf:
entry=csv.reader(f)
ip=[ip[0]foripinentry]
returnip

defget_entry_name(self)->list[str]:
withopen(self._path)asf:
entry=csv.reader(f)
name=[name[1]fornameinentry]
returnname

defget_entry_passwd(self)->list[str]:
withopen(self._path)asf:
entry=csv.reader(f)
passwd=[passwd[2]forpasswdinentry]
returnpasswd


login=Read_date('./source/entry_table.csv')

run.py

importbackup_Script
frombackup_Scriptimportlog

if__name__=="__main__":
log.error('运行脚本')
backup_Script.run()
log.error('执行完成')

requirements.txt

bcrypt==4.0.0
certifi==2022.6.15
cffi==1.15.1
charset-normalizer==2.1.1
cryptography==37.0.4
docopt==0.6.2
idna==3.3
logger==1.4
paramiko==2.11.0
pipreqs==0.4.11
pycparser==2.21
PyNaCl==1.5.0
requests==2.28.1
six==1.16.0
urllib3==1.26.12
yarg==0.1.9

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 华为
    +关注

    关注

    215

    文章

    34292

    浏览量

    251136
  • 交换机
    +关注

    关注

    21

    文章

    2621

    浏览量

    99216
  • python
    +关注

    关注

    55

    文章

    4778

    浏览量

    84439
  • 脚本
    +关注

    关注

    1

    文章

    387

    浏览量

    14829
  • 华为交换机
    +关注

    关注

    0

    文章

    13

    浏览量

    6296

原文标题:如何通过Python脚本批量采集华为交换机配置,值得每位网络工程师参考!

文章出处:【微信号:网络技术干货圈,微信公众号:网络技术干货圈】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    华为路由器交换机VLAN配置实例

    华为路由器交换机VLAN配置实例[hide]华为路由器交换机VLAN配置实例使用4台PC(pc多
    发表于 05-25 00:21

    如何配置以太网交换机

    如何配置以太网交换机 串口通过配置电缆与以太网交换机的Console 口连接。一、通过Cons
    发表于 12-07 14:07 1.8w次阅读
    如何<b class='flag-5'>配置</b>以太网<b class='flag-5'>交换机</b>

    交换机GVRP配置

    交换机GVRP配置
    发表于 12-27 16:15 0次下载

    交换机路由配置

    交换机路由配置
    发表于 12-27 16:31 0次下载

    交换机基础配置

    交换机基础配置
    发表于 12-27 16:50 0次下载

    交换机VLAN配置

    交换机VLAN配置
    发表于 12-27 16:49 0次下载

    交换机STP配置

    交换机STP配置
    发表于 12-27 16:46 0次下载

    华为交换机

    华为交换机
    发表于 03-24 14:17 5次下载

    光纤交换机的种类_光纤交换机配置

    本文主要介绍了光纤交换机的种类和光纤交换机配置
    发表于 11-30 16:04 2130次阅读

    交换机的6种配置模式

    我们在配置交换机的时候首先要了解的就是交换机命令模式,小编用Cisco思科交换机为例带大家了解交换机的6种
    的头像 发表于 09-26 15:01 9005次阅读

    华为三层交换机配置实例

    有朋友讨论华为三层交换机配置问题,今天小编也整理了下华为交换机的文章,大家来一起学习交流下!
    的头像 发表于 06-05 11:19 1292次阅读
    <b class='flag-5'>华为</b>三层<b class='flag-5'>交换机</b><b class='flag-5'>配置</b>实例

    华为交换机如何批量清除接口配置信息

    华为交换机如何批量清除接口配置信息
    的头像 发表于 08-14 10:43 3038次阅读

    使用python批量备份华为交换机配置文件

    保证PC能分别和五台交换机通信。五台交换机的IP地址如图上所示。
    的头像 发表于 01-19 09:28 1316次阅读
    使用<b class='flag-5'>python</b><b class='flag-5'>批量</b>备份<b class='flag-5'>华为</b><b class='flag-5'>交换机</b><b class='flag-5'>配置</b>文件

    使用Python脚本备份华为交换机配置信息

    在现代网络管理中,备份交换机配置信息是一项至关重要的任务。备份可以确保在交换机发生故障或配置错误时,能够迅速恢复到之前的工作状态。本文将详细介绍如何使用
    的头像 发表于 08-12 17:50 480次阅读
    使用<b class='flag-5'>Python</b><b class='flag-5'>脚本</b>备份<b class='flag-5'>华为</b><b class='flag-5'>交换机</b>的<b class='flag-5'>配置</b>信息

    利用Python脚本登录到交换机并创建VLAN

    本文将详细介绍如何利用Python脚本登录到交换机并创建VLAN。
    的头像 发表于 08-12 17:59 515次阅读