【问题标题】:How to open a new pyghmi Session via pyghmi.impi.command.Command after the previous one has timed out?如何在前一个会话超时后通过 pyghmi.impi.command.Command 打开一个新的 pyghmi 会话?
【发布时间】:2021-03-15 12:18:05
【问题描述】:

我在使用pyghmi python 库时遇到了一些问题,该库用于通过 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 回调”函数来使用异步方式,因为我需要调用者中的回调返回值,而这在这种情况下是不可能的线程行为。

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

【问题讨论】:

  • 这个问题似乎对社区很有希望。只是一个小建议,尝试解决pyghmi documentation
  • 是的,你是对的,我已经检查了我能找到的所有文档,主要问题在这里:我认为没有足够的关于 pyghmi 的文档......提供了一些示例here 但是它总是一次性运行的脚本,而我正在寻找可以永远“保持”状态的东西。我想我会通过电子邮件发送 pyghmi 的主要贡献者。
  • 感谢您的评论。根据你所说的,试着改进你的问题,告诉社区你在上一条评论中所说的话。这将有助于并改善您的问题。

标签: python openstack ipmi


【解决方案1】:

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

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

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

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

Confluent 是 Lenovo 开发的一个工具,允许通过 HTTP 控制硬件。它使用一种修补版本的 Pyghmi 作为 IPMI 调用的后端。 Confluent documentation here.

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

【讨论】:

    猜你喜欢
    • 2021-04-01
    • 2012-01-18
    • 1970-01-01
    • 2012-01-21
    • 2014-01-30
    • 2020-12-25
    • 2018-06-11
    • 2018-12-25
    • 1970-01-01
    相关资源
    最近更新 更多