写在前面

本打算自动登陆一台路由器,执行查询配置指令,然后用正则表达式分析,获取该路由器的接口连接关系。

现在由于网络问题,导致无法直接telnet路由器,只能通过其他方式获取配置文件,如读取本地文件等。

由于时间关系,本教程修改如下:

第一部分通过telnet模块测试登陆、执行指令,登陆设备改为MME;

第二部分还是之前的配置文件分析,只是配置文件来源于本地已下载的配置文件。

同时大家也可以研究其他登陆网元等自动获取信息的方法,如指令平台等。

Python在自动运维方面也有很多第三方库,可以帮助我们自动ssh/telent设备、执行指令,分析结果等。

通常情况下Python自动运维在互联网公司应用更多,因为他们维护设备主要都是类似的linux服务器,操作统一。

而我们所面临的不同厂家不同设备的CT设备,Python自动运维相对较少,不过现在已经是ICT融合,目前引入的NFV技术有大量IT设备,Python自动运维可以发挥更多作用。

本教程还是想通过解决一个实际问题,分享Python自动运维的简单知识,更多的我也在学习中。

问题需求

日常我们维护着大量的设备,每个设备都有账号密码,账号密码是否过期?设备能否正常登陆?同时我们还需要执行大量指令并进行分析,判断设备是否正常。

今天我们的任务是,给定某设备IP地址,用户名和密码,完成以下任务:

模拟telnet/ssh设备,可以测试账号可用性,设备连通性

执行指令,返回结果,如查询配置文件

分析配置文件,比如关注拓扑信息,可以学习Python正则表达式的基本知识;

代码实现

模拟telnet/ssh

Python有很多第三方库,实现ssh、ftp、telnet等命令交互,如pexpect、paramiko等,不过这些我都还没时间认真研究,就用Python自带的telnetlib实现最简单的telnet功能,后续如果有需求再进一步学习。

模拟telnet的代码如下:

import telnetlib

host = "x.x.x.x" #设备IP,将来可以从一个地址池中读取

user =b 'x' #用户名密码

password =b 'x'

finsh = b"#" #结束符号

tn = telnetlib.Telnet(host) #创建telnet连接

tn.read_until(b"login: ") #读取到给定字符串

tn.write(user + b"\n") #输入用户名

tn.read_until(b"Password: ")

tn.write(password + b"\n")

tn.read_until(finsh)

注意在网管网换成可以IP测试,可以看到,python正在模拟人工登陆,我认为:

telnetlib.Telnet(host) 没有报错,说明设备网络通的,也开放了telnet端口;

tn.read_until(finsh) 执行完毕,说明账号密码正常,可以正常登陆

执行指令并返回结果

正常telnet设备后,我们准备执行指令,我们查询爱立信MME attach相关指标,指令如下:

attach | tail -10

我们使用Python执行指令,代码如下:

command =b "attach | tail -10" #待执行指令

tn.write(command + b"\n") #Python执行指令,模拟人工输入、回车

res = tn.read_until(finsh) #python读取指令结果

tn.read_until(finsh) 可以理解为从执行上条指令开始,一直读取到finsh(这里是#,不同平台可能不一样,如~)结束。

我们可以查看res结果如下,说明已经正确完成指令结果读取。

image.png

分析本地配置文件

由于路由器暂时无法直接telnet,只能通过分析本地配置文件。其实对于上述MME的指令结果也可以继续分析,只是以下内容很早已经完成,实现思路都是一样的。

分析指令结果

配置文件可以分析很多东西,这里我们只分析路由器的接口数据,也就是配置了哪些接口?对端分别是哪些网元,接口IP是多少?

我们看下接口配置样例。

interface GigabitEthernet2/0/8.1055

vlan-type dot1q 1055

description To-[HZMxx]-[MHRD|2|4|11|B|1]-1G

ip binding vpn-instance xx_xx_Media

ip address x.x.x.149 255.255.255.252

statistic enable

我们可以通过正则表达式匹配这段内容,并提取相应信息。

Python正则表达式re

关于Python正则表达式的知识非常多,可以写一本书,显然我写不出来。

我曾经看过一份不错的教程Python正则表达式指南,转自# AstralWind,可以研究下。

所谓正则表达式,就是给定一个模式字符串表达式patten,然后逐一匹配字符串,正如我们熟悉的*表示任何东西一样。

Python正则表达式示例,我想在一句英文中匹配是否存在hello。

import re

# 将正则表达式编译成Pattern对象

pattern = re.compile(r'hello')

s = pattern.search('hello world!') #调用search函数,查找

if s: #匹配成功为真

print(s.group())

#以上是输出

hello

Pattern对象是一个编译好的正则表达式,提供了很多方法使用,如match()、search()、findall()。

今天我们用findall()匹配设备接口信息,会以列表形式返回全部匹配的字串代码如下:

In[227]: import pandas as pd

f = open(u'XXXCE06-HWNE40E_配置备份文件保存.txt','r')

conf = f.read()

p_int= re.compile(r"interface GigabitEthernet(.*?)\n.*?description (.*?)\n")

ints = p_int.findall(conf)

#转换为DataFrame,以便后续输出报错

ints = pd.DataFrame(ints,columns = ['interface','description'])

ints['interface'] = ['GigabitEthernet'+i for i in list(ints['interface'])]

In[228]: ints.head()

Out[228]:

interface description

0 GigabitEthernet1/0/10 TO-[xxx]-[LSW01-GE0/0/13]_1G

1 GigabitEthernet1/0/23 TO-xxx-1G-WANGGUAN

2 GigabitEthernet2/0/1 TO-[GDHIZ-xxx-HWNE40E]-GE2/0/1-1G

3 GigabitEthernet2/0/2 TO-[GDHIZ-xxx-HWNE40E]-GE2/0/2-1G

4 GigabitEthernet2/0/3 To-[HZMxx]-[MHRD|1|2|11|B|1]-1G

其中正则表达式"interface GigabitEthernet(.?)\n.?description (.*?)\n",

表示以interface GigabitEthernet开头,先匹配任意字符,直到换行\n;第一个括号内就是接口号interface;然后再忽略一些字符. *?,找到description ,后面对应对端名称,以换行符\n结束匹配。

这个写法直接返回()中匹配上的内容,如端口号、desc等,但是对于没有desc的端口则无法匹配命中。

整个配置文件findall()后可以全部匹配想要的接口号及对端信息。

更多接口信息

上面只匹配了有对端的GigabitEthernet接口信息,其实路由有很多接口类型,如vlan,还有子接口等,下面尝试写一个更全面的功能,能够分析所有接口信息。

#给定配置文件conf,返回全部接口信息

def get_intferaces(conf):

p_int = re.compile(r'#\n(interface .*?)\n#',re.S)

ints = p_int.findall(conf)

cols = ['interface','is_shutdown','description','ipaddress','vpn-instance','vlan']

rows = []

for i in ints:

name = i.split('interface ')[1].split('\n')[0]

if ('NULL' not in name) & ('Virtual' not in name):

if 'description ' in i:

desc = i.split('description ')[1].split('\n')[0]

else:

desc = ''

if 'ip address ' in i:

ipaddress = i.split('ip address ')[1].split('\n')[0]

else:

ipaddress = ''

if 'ip binding vpn-instance ' in i:

vpn = i.split('ip binding vpn-instance ')[1].split('\n')[0]

else:

vpn = ''

if 'port default vlan ' in i:

vlan = i.split('port default vlan ')[1].split('\n')[0]

else:

vlan = ''

if 'undo shutdown' in i:

is_shutdow = 'undo shutdown'

elif 'shutdown' in i:

is_shutdow = 'shutdown'

else:

is_shutdow = '' #为空表示没有这个字段

row = [name,is_shutdow,desc,ipaddress,vpn,vlan]

rows.append(row)

interfaces = pd.DataFrame(rows,columns = cols)

return interfaces

由于接口类型很多,不好用统一的正则表达式匹配,大家有兴趣可以用正则写,这里傻瓜式的if判断。

通过get_intferaces(conf)可以获取到全部接口信息。然后可以对这些接口信息进行处理,比如只保留在用端口,IP地址用子网表示等。

#只保留在用端口

interfaces = interfaces[~interfaces['is_shutdown'].isin(['shutdown'])]

由于对端描述不是特别规范,提取真实网元名称需要一些判断逻辑,不麻烦,同时如果知道全部IP地址信息,可以用子网进行匹配,更准确。

最终代码

整理上面代码,汇总如下,大家可以新建automain_demo.py,复制以下代码,测试是否正常。(需要内网环境,能够连上网元,目前也只能连上部分网元)

import telnetlib

import re

import pandas as pd

#在指定网元上执行指令,并返回指令结果

def doComd(host,user,password,finsh,commands):

tn = telnetlib.Telnet(host)

tn.read_until(b"login: ")

tn.write(user +b "\n")

tn.read_until(b"Password: ")

tn.write(password + b"\n")

tn.read_until(finsh)

print(host+"登陆成功!")

res = []

#可以执行多条指令

for command in commands:

tn.write(command +b "\n")

res.append(tn.read_until(finsh))

tn.close()

return res

#给定配置文件conf,返回全部接口信息

def get_intferaces(conf):

p_int = re.compile(r'#\n(interface .*?)\n#',re.S)

ints = p_int.findall(conf)

cols = ['interface','is_shutdown','description','ipaddress','vpn-instance','vlan']

rows = []

for i in ints:

name = i.split('interface ')[1].split('\n')[0]

if ('NULL' not in name) & ('Virtual' not in name):

if 'description ' in i:

desc = i.split('description ')[1].split('\n')[0]

else:

desc = ''

if 'ip address ' in i:

ipaddress = i.split('ip address ')[1].split('\n')[0]

else:

ipaddress = ''

if 'ip binding vpn-instance ' in i:

vpn = i.split('ip binding vpn-instance ')[1].split('\n')[0]

else:

vpn = ''

if 'port default vlan ' in i:

vlan = i.split('port default vlan ')[1].split('\n')[0]

else:

vlan = ''

if 'undo shutdown' in i:

is_shutdow = 'undo shutdown'

elif 'shutdown' in i:

is_shutdow = 'shutdown'

else:

is_shutdow = '' #为空表示没有这个字段

row = [name,is_shutdow,desc,ipaddress,vpn,vlan]

rows.append(row)

interfaces = pd.DataFrame(rows,columns = cols)

interfaces = interfaces[~interfaces['is_shutdown'].isin(['shutdown'])]

return interfaces

if __name__ == "__main__":

host = "x.x.x.x" #设备IP,将来可以从一个地址池中读取

user = b'x' #用户名密码

password =b 'x'

finsh = b"#" #结束符号

command = ["hostname","dispaly current-config"]

#result = doComd(host,user,password,finsh,command)

f = open(u'GDHIZ-NGN-CE06-HWNE40E_配置备份文件保存.txt','r')

result = f.read()

#hostname = result[0]

hostname = "test"

conf = result[1]

interface = get_intferaces(conf)

interface.to_csv(hostname+'.csv',encoding = 'utf8',index = False)

注意换成真实的IP、用户名和密码既可,然后在命令行中运行测试。

image.png

可以发现,运行脚本后,新增test.csv文件:

image.png

上面这个脚本只是基础,还可以扩展出很多功能,如稍微修改了,就可以遍历一个IP地址池,大家可以试试。

通过配置文件分析的信息更全更准确,可以有效帮助提升工作效率,同时还可以执行其他指令,并借助Python强大的分析能力进行处理。

Python也可以实现网络自动运维,而且非常简单易学,让我们能够便捷维护海量设备。

这篇写的很赶,这方面内容以前掌握比较少,今天在这里只是抛砖引玉,说与神器Python是可以帮我们自动运维的,希望和大家一起学习进步。

下一篇,我想分享下Python在网络爬虫方面的简单应用——简明Python开发教程(5):用爬虫实现个性化搜索引擎

简书python自动化运维_简明Python开发教程(4):网络自动化运维的曙光相关推荐

  1. 简单叙述python的编程规范_简明 Python 编程规范

    注:之前发布一篇<简明 Python 编程规范>(见:http://blog.csdn.net/lanphaday/article/details/2834883),本是我给当时所在的公司 ...

  2. 送书 | 令附生信专用简明 Python 文字和视频教程

    欢迎来到Python的世界,本教程将带你遨游Python,领悟Python的魅力.本教程专注于帮助初学者,尤其是生物信息分析人员快速学会Python的常用功能和使用方式,因此只精选了部分Python的 ...

  3. python运行怎么下一步_简明Python3教程 18.下一步是什么

    如果你有认真通读本书之前的内容并且实践其中包含的大量例程,那么你现在一定可以熟练使用python了. 同时你可能也编写了一些程序用于验证python特性并提高你的python技能.如果还没有这样做的话 ...

  4. python指定数组大小_在python中创建指定大小的多维数组方式

    python中创建指定大小的二维数组,有点像C++中进行动态申请内存创建数组,不过相比较而言,python中更为简单一些. 创建n行m列的二维数组: n = 2 m = 3 matrix = [Non ...

  5. 看不懂简明python教程_简明python教程之Python文件头注释的含义,你肯定不懂

    https://www.xin3721.com/eschool/pythonxin3721/ 本文档描述了Python语言文件头里典型注释的含义. 1. 指定解释器 不管在linux还是在window ...

  6. python大数据免费_用python做大数据

    不学Python迟早会被淘汰?Python真有这么好的前景? 最近几年Python编程语言在国内引起不小的轰动,有超越Java之势,本来在美国这个编程语言就是最火的,应用的非常非常的广泛,而Pytho ...

  7. python加入中小学课程_【python即将进入中学课堂,编程从小抓起,竟然在这几点上应验了】- 环球网校...

    [摘要]我们都知道,不论是我们使用的app,还是各种各样的游戏,小程序,都离不开编程软件的贡献,其中python占据了半壁江山,随着大家对python的重视,python即将进入中学课堂,这究竟是好是 ...

  8. 学python就业到底如何_学习python后,就业如何?

    Python技术相关人才,正是迎合了目前人工智能时代的发展趋势,Python作为人工智能的首选语言,其发展前景那是大大的好. 学习python原因 1.python是脚本语言,作为程序员至少应该掌握一 ...

  9. 为什么python发展的好_为什么Python发展这么快,有哪些优势?

    正所谓"男怕入错行,女怕嫁错郎",可想而知进入一个正确的行业有多重要.IT行业的高薪吸引着越来越多转行"入坑",Python作为目前的大势,是很多人转行的首选. ...

最新文章

  1. 二十万字!耗时90天
  2. SpringBoot:class path resource [xxxx.xml] cannot be opened because it does not exist
  3. 浅谈 CTR 预估模型发展史
  4. php如何导入数据,““php中如何将execl的数据导入到数据库中
  5. mybatis笔记之一次插入多条数据sql语句写法
  6. 次短路 Yen氏算法 凸包
  7. 微软 Chromium Edge 禁用 Google?
  8. “adb server is out of date.
  9. 通讯简单测试—Modscan32使用简介-Susie 周
  10. Ansible 配置Windows Update
  11. 欧文工学院计算机,UCI的EECS「加州大学欧文分校电气工程与计算机科学系」
  12. 小米口碑营销案例的十大秘诀
  13. mysql用存储过程更新表_如何创建存储过程以更新MySQL表中的值?
  14. 【图像处理 -1图像恢复】非线性过滤器修复图像
  15. IBinder对象在进程间传递的形式(一)
  16. Go语言6种字符串拼接的方式
  17. [护肤] 去皱汇总+19个民间小偏方
  18. 大题历年题合集-信息资源管理
  19. unity 3d物体显示和2dUI显示相结合
  20. iOS 设计主题(迟来的总结)

热门文章

  1. 来一波我和朋友们的私房菜!
  2. 这款 IDE 插件再次升级,让「小程序云」的开发部署提速 8 倍
  3. 御泥坊搜索引擎优化网络诊断_掌握以下这些网络营销搜索引擎优化技巧,你的排名想不靠前都难!...
  4. php es6写法,ES6...扩展运算符(示例代码)
  5. “文艺复兴” ConvNet卷土重来,压过Transformer FAIR重新设计纯卷积新架构
  6. python 向量余弦相似度
  7. mxnet is not presented
  8. error C1004 发现意外的文件尾
  9. python按时间排序 文件
  10. pyqt setStyleSheet用法