首页 > 解决方案 > 如何在前一个会话超时后通过 pyghmi.impi.command.Command 打开一个新的 pyghmi 会话?

问题描述

我在使用pyghmipython 库时遇到了一些问题,该库用于使用 python 脚本发送 IPMI 命令。我的目标是实现一个 HTTP API 以通过 HTTP 请求发送 IPMI 命令。

我已经能够创建一个会话并使用库发送一些命令,但如果会话保持空闲 30 秒,它会自行注销。当 Session 注销时,我无法创建一个新的:我收到错误“会话已注销”或死锁。

如果我想拥有一台始终处于启动状态的服务器并在收到请求时创建 Session,如果在前一个会话注销时我无法创建新会话,我该怎么办?

我试过的:

from pyghmi.ipmi import command

ipmi = command.Command(ip, user, passwd)
res = ipmi.get_power()
print(res)

# wait 30 seconds

res2 = ipmi.get_power() # get "Session logged out" error

ipmi2 = command.Command(ip, user, paswd) # Deadlock if wait < 30 seconds, else no error

res3 = ipmi2.get_power() # get "Session logged out" error

# Impossible to create new command.Command() Session, every command will give "logged out" error

另一个问题是我不能通过在command.Command()调用中提供“onlogon 回调”函数来使用异步方式,因为我需要调用者中的回调返回值,而这种线程行为是不可能的。

编辑:我已经尝试过这里提供的一些示例,但它始终是一次性运行脚本,而我正在寻找可以永远“保持”状态的东西。

标签: pythonopenstackipmi

解决方案


所以我终于实现了一种解决方案。我给 Pyghmi 的主要贡献者发了电子邮件,他说这个库不适合多和可重用的 Session 实现(目前 Pyghmi 存储库上有一个未解决的问题“会话重用”)。

第一个“解决方案”:使用流程

我的目标是创建一个 HTTP API。为了避免会话超时问题,我为每个新请求创建一个新进程(不是线程)。这很好用,但我没有保留这个解决方案,因为它很重并且消耗套接字。似乎通过创建进程,Pyghmi 使用的内存不会在进程之间共享(这是进程的目标),因此每次 Session 使用都不是重用而是创建。

第二个“解决方案”:使用 Confluent

Confluent 是联想开发的一个工具,允许通过 HTTP 控制硬件。它使用一种修补版本的 Pyghmi 作为 IPMI 调用的后端。汇合文档在这里

在服务器上安装和配置后,Confluent 可以很好地通过 HTTP 控制 IPMI 设备。我将它与一个ipmi_simulator用于测试目的的 Docker 映像一起打包:confluent dockerized


推荐阅读