骚年 运维少年
运维少年系列 - python and cisco(2)一、任务概述假设网络有多台可管理的二层交换机,现在需要在每台交换机上创建10个VLAN,在没有CDP的情况下,如何使用python完成?(别忘了python几乎适用于所有支持远程登录的设备)
二、实现步骤说明1) 先决条件首先准备的还是和上篇文章一样,交换机需要开启SSH和配置IP,请将所有设备登录的用户名和密码配置一致。
2) 拓扑图3) 如何实现多IP如果网络中有台设备,那么每台设备的IP地址都是不一样的(这是废话),我们如何去逐个登录多台设备然后执行命令呢?
在python中,如果是连续的地址,那么我们可以使用for循环实现逐个登录设备的功能,比如
[root@yunwei cisco]# cat for.py for i in range(1,10): print '192.168.108.%s' %i[root@yunwei cisco]# [root@yunwei cisco]# python for.py 192.168.108.1192.168.108.2192.168.108.3192.168.108.4192.168.108.5192.168.108.6192.168.108.7192.168.108.8192.168.108.9
但是,如果IP不是连续的怎么办呢?那么在python中我们可以将所有的IP写入一个文件,然后使用for循环去逐行循环该文件,实现登录。如
[root@yunwei cisco]# cat IP.txt 192.168.108.252192.168.108.253[root@yunwei cisco]# [root@yunwei cisco]# cat for.py ip = file('IP.txt','rb') # 以只读的形式打开文件for i in ip.xreadlines(): # 逐行读取文件中的内容 print i,[root@yunwei cisco]# [root@yunwei cisco]# python for.py 192.168.108.252192.168.108.253[root@yunwei cisco]#
4) 如何实现多命令如何一次性执行多个文件?我们可以像上次那样使用多次send函数,但很显然,这样效率太低了。我们可以将命令写道一个文件中,使用for循环对文件进行逐行读取,然后执行。如
[root@yunwei cisco]# cat command.txt conf t vlan 10name V10vlan 20name V20vlan 30name V30vlan 40name V40vlan 50name V50vlan 60name V60vlan 70name V70vlan 80name V80vlan 90name V90vlan 100name V100exitint e0/0switchport trunk encapsulation dot1qswitchport mode trunkendshow vlan show int trunk[root@yunwei cisco]# [root@yunwei cisco]# cat for.py cmd = file('command.txt','rb')for i in cmd.xreadlines(): print i,[root@yunwei cisco]#
最终脚本这里做个简单的注释,详细注释请参考第一篇文章。
import paramiko # 导入模块import timeuser = 'yunwsn' # 定义登录用户名passwd = '123456' # 定义登录密码s = paramiko.SSHClient() # 实例化s.set_missing_host_key_policy(paramiko.AutoAddPolicy())IP = file('IP.txt','rb') # 打开IP文件for ip in IP.xreadlines(): # 循环IP文件 s.connect(ip,username=user,password=passwd,look_for_keys=False,allow_agent=False) # 登录读取到的IP文件行 print '[ \033[0;32m success\033[0m ] login %s ' %ip # 打印登录成功信息 cmd = s.invoke_shell() # 交互式sshell command = file('command.txt','rb') # 因为上面已经登录成功,这里打开命令文件 for command in command.xreadlines(): # 逐行读取命令 cmd.send(command) # 执行命令 time.sleep(0.1) output = cmd.recv(65535) # 每执行一个命令就打印一次 print output cmd.close() # 一个IP命令执行完毕,关闭交互式shell,循环下一个ipIP.close() # 全部Ip执行完成,则关闭IP文件
效果如下(动图)
登录交换机查看结果