基于pexpect的网络自动化配置

2019-07-23  本文已影响0人  白小黑66黑

本篇是基于pexpect的网络自动化配置的总结帖,目前需要实现的功能均已良好实现,期间遇到多个困难,在此进行复盘。

第一个问题,for 循环取出ip列表, ip.txt里基于回车作分割,里面存放了所有网络设备的ip地址, 如何用for循环逐个取出,并且做ssh登录。

在解决了第一个问题后,开始做配置备份脚本,本质理论就是用child.logfile做日志记录输出,通过pexpecet  把dis cu ,show run ,等命令 ,打到网络设备上去。有好多种网络配置备份的方法,本人认为还是pexpect最好,原因如下:

1:pexpect灵活 ,只要网络设备能支持telnet ssh登录,即可进行配置抓取,不需要其它模块支持,比如偏门的神码设备,或中兴设备,或型号较为老旧的设备,只要支持telnet ssh即可。

2: pexpect 安全性高, 把命令打到设备上去,打错了,问题也不大, 比如dis cu  ,误打成了  diss cuu, 网络设备不识别这条命令,只会报错忽略, 虽然命令执行出错,但不会出乱子。例外是把router ospf , 打成了 no router ospf . 这种错误是不行的。

3:pexpect的备份基于命令输出记录日志,那同样可以做设备配置。经多次大坑后总结, pexpect在sendline之后, 不一定总是要做 pexpect expect ,只要加下time.sleep.,让命令稍后再打即可, 前提是要求网工算好每条命令在Sendline后的输出反馈时间。

4: 基于pexpect的配置备份要求设备配置支持terminal length 0之类的命令,目前备份过的设备均有类似命令,因为如果没有类似命令,在输出后会提示类似    more   , 则无法记录输出记录日志和配置。

因此最初基于上面完成了全网网络设备的配置,通过httpd  + fotiguard firewall+ crontal做了一套配置自动备份平台。

后来又发现一个问题,二层的交换机有时候会down掉,不通。当在ip.txt列表文件中的某个交换机不通后,pexpect登录交换机就会timeout,脚本就会报错退出,导致后续交换机全部备份失败。

后来为了解决这个问题, 加了一个if 判断, 取出pexpect登录交换机的返回值 ,当index的值为eof 或timeout也就是报错时, pass掉,忽略这个错误,继续执行后续的代码,避免了因为某个交换机下线不通,导致代码报错退出,后续设备无法备份的情况出现,所以在这里其实用continue更合适, 

continue会不再执行后续的代码, 重新返回到for循环。

脚本大概类似于下面这样:

脚本

脚本做到这一步, 依然还面临这两个重大问题:

1: 不支持多线程, 100多交换机需要半个多小时才能备份完配置。

2:交换机的命令是用Sendline的方式一条一条打进去的, 没有做到模块化。

第二个问题需要尽快解决,因为公司日本公司会有20几台cisco交换机要配置, 供应商会配置好管理地址, 脚本里给每台交换机用Sendline改改改,或者每台交换机再登录, 都会很麻烦。

为了解决第二个问题, 脚本调用两个文件, 一个是ip.txt ,一个是command.txt , 前者用于存放交换机的ip地址,后者用于存放交换机的配置命令。

ip.txt command.txt 脚本

做到这一步, 只剩下多线程了,脚本如下:

script1 script2 script3

大量配置命令需要发送到网络设备的话, 需要考虑到 time.sleep()时间。

=================

20190826更新

在飞塔上遇到了一个坑,因为forti的输出特别快,但没考虑到输出特别长,导致show的输出被截断, 刚好断在有 关键字 console的部分, 以为这个输出就完整了。

考虑到forti支持通过ftp备份,因为用vsftpd搭建了一个Ftp服务器, 每个ftp用户都单独新建了家目录,然后forti全部备份到ftp上。 

之所以需要为每台设备新建用户, 是因为在forti上执行ftp 备份没有办法变更路径。

bk

waf  在web上可以直接指定配置Ftp 备份,奇怪的是命令行没有ftp备份方式,只有tftp备份。

之所以重新变更了配置备份,是因为坑爹的2台1500D , 4个电源模块全挂了。

上一篇下一篇

猜你喜欢

热点阅读