0

这里的情况很有趣。目前我有一个简单的 Flask API,它连接到后端的网络设备并检索命令输出。

from netmiko import ConnectHandler

def _execute_cli(self, opt, command):
        """
           Internal method to create netmiko connection and
           execute command.
        """
        try:
            net_connect = ConnectHandler(**opt)
            cli_output = (net_connect.send_command(command))
        except (NetMikoTimeoutException, NetMikoAuthenticationException,) as e:
            reason = e.message
            raise ValueError('Failed to execute cli on %s due to %s', opt['ip'], reason)
        except SSHException as e:
            reason = e.message
            raise ValueError('Failed to execute cli on %s due to %s', opt['ip'], reason)
        except Exception as e:
            reason = e.message
            raise ValueError('Failed to execute cli on %s due to %s', opt['ip'], reason)
        return cli_output


def disconnect(connection):
    connection.disconnect()

每个命令输出都会在本地缓存一段时间。问题是,有人可以同时进行多个连接,并且设备有连接限制(比如说 7)。如果调用过多,会发生 SSH 连接问题,因为已达到最大连接数。

我要做的是在指定的时间段(比如说,5 分钟)内跨设备的这些 API 调用保留单个会话,这样我就不会填充设备上的连接。

请指教。

4

1 回答 1

0

好的,我不确定“在这些 API 调用中保留一个会话”是什么意思。但也许你可以做这样的事情。

每 5 分钟为所有设备及其用户数量创建一个字典。例如:

self.users = {device:0 for device in devices}

然后每当_execute_cli()调用函数时,您可以在发送命令之前检查设备中的用户数量(在 cisco 中,命令是“显示用户”)并更新变量self.users[device] = some_number

所以你可以像这样简单地检查:

if self.users[device] < 7:
    try:
        net_connect = ConnectHandler(**opt)
        cli_output = (net_connect.send_command(command))
...
于 2020-03-05T12:21:59.770 回答