目标:
- ssh到excel文件中列出的每个设备,执行命令,捕获输出并以表格格式显示输出(输出表a列:设备名称,B列:命令输出(
- 使用多处理优化处理时间以扩展100秒的设备
到目前为止,我可以使用以下代码实现这一点,但我觉得应该有更好的方法来实现这一目标。参考
问题说明:
- 我的输入是一个字典而不是列表,作为一种变通方法,我在下面的代码中将其转换为列表
- 目标函数需要字典元素作为输入
- 每个进程的输出(switchname和命令输出(应该返回到主进程以形成数据帧
excel文件中的样本表
DeviceName | DeviceIP地址 |
---|---|
路由器1121 | 192.168.1.1 |
路由器1122 | 192.168.1.2 |
路由器1131 | 192.168.1.3 |
路由器1132 | 192.168.1.4 |
我能够通过使用多处理的Pool类找到另一种更好的方法来实现目标。
import multiprocessing
import paramiko
from collections import defaultdict
import pandas as pd
import stdiomask
ssh = paramiko.SSHClient()
def connect_device(admin_username, admin_password, devicename, ipaddress):
devicename = mylist[1]['DeviceName']
ipaddress = mylist[1]['DeviceIPaddress']
print(f"Trying to connect to {devicename}")
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=ipaddress, port=22, allow_agent=False, username=admin_username, password=admin_password)
print(f"Connection established to {devicename}")
command = "show interface description | i Gi1/0/23"
stdin, stdout, stderr = ssh.exec_command(command)
out = stdout.read()
ssh.close()
return devicename, out
if __name__ == '__main__':
df = exceltodataframe('Deviceinfo.xlsx', 'Devicedetails')
# create dictionaries from the dataframes
dfdict = df.T.to_dict()
mylist = list(dfdict.items())
admin_username = input("Enter the username: ")
admin_password = stdiomask.getpass("Enter the password: ")
p = multiprocessing.Pool()
result = p.map(connect_device, mylist)
def_dct_all = defaultdict(dict)
for r in range(len(result)):
def_dct_all[r]['DeviceName'] = result[r][0]
def_dct_all[r]['Description'] = result[r][1].decode("utf-8").rstrip()
resultdf = pd.DataFrame(def_dct_all).T
print(resultdf)