基于pexpect的网络自动化配置
本篇是基于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 备份没有办法变更路径。
bkwaf 在web上可以直接指定配置Ftp 备份,奇怪的是命令行没有ftp备份方式,只有tftp备份。
之所以重新变更了配置备份,是因为坑爹的2台1500D , 4个电源模块全挂了。