运维少年系列 - python and cisco(2)

运维少年系列 - python and cisco(2)

1、任务概述

假设网络有多台可管理的二层交换机,如今须要在每台交换机上建立10个VLAN,在没有CDP的状况下,如何使用python完成?(别忘了python几乎适用于全部支持远程登陆的设备)python

2、实现步骤说明

1) 先决条件

首先准备的仍是和上篇文章同样,交换机须要开启SSH和配置IP,请将全部设备登陆的用户名和密码配置一致。shell

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.1
192.168.108.2
192.168.108.3
192.168.108.4
192.168.108.5
192.168.108.6
192.168.108.7
192.168.108.8
192.168.108.9

可是,若是IP不是连续的怎么办呢?那么在python中咱们能够将全部的IP写入一个文件,而后使用for循环去逐行循环该文件,实现登陆。如运维

[root@yunwei cisco]# cat IP.txt 
192.168.108.252
192.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.252
192.168.108.253
[root@yunwei cisco]#

4) 如何实现多命令

如何一次性执行多个文件?咱们能够像上次那样使用屡次send函数,但很显然,这样效率过低了。咱们能够将命令写道一个文件中,使用for循环对文件进行逐行读取,而后执行。如ssh

[root@yunwei cisco]# cat command.txt 
conf t 
vlan 10
name V10
vlan 20
name V20
vlan 30
name V30
vlan 40
name V40
vlan 50
name V50
vlan 60
name V60
vlan 70
name V70
vlan 80
name V80
vlan 90
name V90
vlan 100
name V100
exit
int e0/0
switchport trunk encapsulation dot1q
switchport mode trunk
end
show 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]# 

最终脚本

这里作个简单的注释,详细注释请参考第一篇文章。ide

import paramiko # 导入模块
import time
user = '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,循环下一个ip
IP.close() # 所有Ip执行完成,则关闭IP文件

效果以下(动图)函数

登陆交换机查看结果ui

微信公众号:运维少年spa

相关文章
相关标签/搜索