運維少年系列 - python and cisco(2)

運維少年系列 - 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.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循環對文件進行逐行讀取,然後執行。如

[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]# 

最終腳本

這裏做個簡單的註釋,詳細註釋請參考第一篇文章。

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文件

效果如下(動圖)

登錄交換機查看結果

微信公衆號:運維少年


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章