模拟场景和需求:
有100台华为的S5700交换机已经在正常运作,通过SSH连接,用户名和密码一致。由于业务需要,统一更改部分接口的配置。
目录结构:
set_commands.py # 执行文件
cmds.txt # 需要更改的配置命令
注意事项:
需要netmiko模块,可以通过 "pip install netmiko" 来安装
文件内容:
set_commands.py 内容如下:
from netmiko import ConnectHandler
from netmiko.ssh_exception import NetMikoAuthenticationException, NetMikoTimeoutException
import threading
import datetime
import queue
import re, os
def conn_info(ip):
dev = {
'device_type': 'huawei',
'host': ip,
'username':'{username}',
'password': '{password}',
}
return dev
def conn_dev(dev_q):
while not dev_q.empty(): #读取队列获得每一台交换机的IP
dev_ip = dev_q.get()
try:
dev_conn = ConnectHandler(**conn_info(dev_ip))
print("[%s] Connected." % dev_ip)
dev_conn.send_config_from_file('cmds.txt') #将写好的命令行逐条写入交换机
output = dev_conn.send_command_timing('save') #保存已更改的配置
if "Y/N" in output:
dev_conn.send_command_timing('y')
dev_conn.disconnect()
print('[%s] done.' % dev_ip)
except NetMikoAuthenticationException:
print("[%s] Error! Please check username or password ..." % dev_ip)
except NetMikoTimeoutException:
print("[%s] Error! Connect time out ..." % dev_ip)
except Exception as e:
print('[%s] Error:%s' % (dev_ip, e))
if __name__ == "__main__":
#交换机的IP地址列表,也可以读取文件(txt/excel/...)来获取
devs_ip = ['192.168.1.1', {......}, '192.168.1.100']
devs_q = queue.Queue()
for dev in devs_ip:
devs_q.put(dev)
max_conn = 15 # 同时操作交换机数量(可增加或减少)
ts = [] # 线程集合
for i in range(max_conn):
t = threading.Thread(target=conn_dev, args=(devs_q,))
t.start()
ts.append(t)
for t in ts:
t.join()
print("Done.")
cmd.txt 内容如下:
int g 0/0/1
port link-type access
port default vlan 10
quit
int g 0/0/3
shutdown
quit
int g 0/0/10
port default vlan 20
quit