遇到多线程问题同时连接到多个设备
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了遇到多线程问题同时连接到多个设备相关的知识,希望对你有一定的参考价值。
我用def get_info()
定义了主要功能。此函数不接受参数。该程序使用argumentParser
从命令行解析参数。提供的参数是带有--csv
选项的CSV文件。这将从当前目录中获取csv文件并读取每个包含IP地址的行,以串行方式登录到设备并运行几个命令返回输出并附加到文本文件中。代码运行时,它会从目录中删除旧的文本文件,并在执行时创建一个新的输出文本文件。问题:我想使用线程模块实现这一点,这样它就需要并行5个设备并输出到文件中。我正在运行的问题是锁定问题,因为同一个进程同时使用同一个对象。这里是我编写的示例代码。线程概念对我来说很新,所以请理解。
import getpass import csv import time import os import netmiko import paramiko from argparse import ArgumentParser from multiprocessing import Process,Queue
def get_ip(device_ip,output_q):
try:
ssh_session = netmiko.ConnectHandler(device_type='cisco_ios', ip=device_row['device_ip'],
username=ssh_username, password=ssh_password)
time.sleep(2)
ssh_session.clear_buffer()
except (netmiko.ssh_exception.NetMikoTimeoutException,
netmiko.ssh_exception.NetMikoAuthenticationException,
paramiko.ssh_exception.SSHException) as s_error:
print(s_error)
def main():
show_vlanfile = "pool.txt"
if os.path.isfile(show_vlanfile):
try:
os.remove(show_vlanfile)
except OSError as e:
print("Error: %s - %s." %(e.filename, e.strerror))
parser = ArgumentParser(description='Arguments for running oneLiner.py')
parser.add_argument('-c', '--csv', required=True, action='store', help='Location of CSV file')
args = parser.parse_args()
ssh_username = input("SSH username: ")
ssh_password = getpass.getpass('SSH Password: ')
with open(args.csv, "r") as file:
reader = csv.DictReader(file)
output_q = Queue(maxsize=5)
procs = []
for device_row in reader:
# print("+++++ {0} +++++".format(device_row['device_ip']))
my_proc = Process(target=show_version_queue, args=(device_row, output_q))
my_proc.start()
procs.append(my_proc)
# Make sure all processes have finished
for a_proc in procs:
a_proc.join()
commands = ["terminal length 0","terminal width 511","show run | inc hostname","show ip int brief | ex una","show
vlan brief“,”终端长度70“] 输出='' 对于命令中的cmd: 输出+ =“\ n” 输出+ = ssh_session.send_command(cmd) 输出+ =“\ n” 使用open(“pool.txt”,“a”)作为输出文件: 而不是output_q.empty(): output_queue = output_q.get() 对于output_queue中的x: outputfile.write(x)的
如果name ==“main”: 主要()
看起来你有来自Django示例的代码:
def main():
'''
Use threads and Netmiko to connect to each of the devices in the database.
'''
devices = NetworkDevice.objects.all()
您应该将参数解析移动到主线程中。您应该在主线程中读取CSV文件。您应该让每个子线程都是Netmiko-SSH连接。
我说这是你当前的解决方案 - 所有的SSH连接都发生在一个不是你想要的线程中。
在高级main()应该有参数解析,删除旧输出文件,获取用户名/密码(假设所有设备都相同),循环CSV文件获取每个设备的IP地址。
获得IP地址后,创建一个线程,该线程使用Netmiko-SSH连接到每个设备并检索输出。然后我会使用一个队列来传回每个设备的输出(返回主线程)。
然后回到主线程中,您将所有输出写入单个文件。
它看起来有点像这样:
下面是一个使用队列(使用多处理)的示例,尽管您可以很容易地使用线程队列来调整它。
以上是关于遇到多线程问题同时连接到多个设备的主要内容,如果未能解决你的问题,请参考以下文章