支持启用SNMP的智能PDU的电源驱动程序

Launchpad蓝图

https://blueprints.launchpad.net/ironic/+spec/ironic-snmp-power-driver

该蓝图提出了一种通过启用或禁用机架电源插座来远程控制节点电源的机制。结果将是对Ironic可以控制的硬件进行更广泛的泛化。

问题描述

目前,Ironic的物理硬件支持仅限于实现具有嵌入式管理硬件(例如BMC或其他实现IPMI的系统)的电源控制的服务器。该蓝图建议通过添加对可以通过SNMP控制的一类电源设备的支持来扩展Ironic的功能,包括具有网络连接的智能PDU。

实现与智能PDU的接口将能够控制由通用硬件构建的裸机计算节点,这些节点不包括BMC。注重成本的用户可能希望在无需额外费用支持集成电源管理的服务器设备的情况下使用裸机计算。

提议的变更

建议的设计将向Ironic引入一个新的驱动程序,snmp.py。一个驱动程序类将提供SNMP管理器实体,该实体可以通过SNMP将电源管理操作一直传送到PDU上的SNMP代理。类将从这个基本驱动程序派生,以添加用于与不同供应商设备接口的特定对象标识符(OID)和方法。

建议的设计将使用PySNMP包,该包实现了SNMP技术的许多方面。PySNMP包支持所有SNMP版本,例如v1、v2c和v3。APC的智能PDU似乎支持SNMP v1和v3。为每个管理的PDU指定协议版本将是可取的。默认情况下,应使用版本3,因为它具有更高的安全性。

请注意,此蓝图仅提出针对裸机计算节点实例的电源管理。

请注意,此蓝图仅提出对由单个插座供电的裸机计算节点的支持。假设具有冗余PSU的服务器也将包括嵌入式管理,例如BMC。

似乎没有用于PDU控制的标准MIB。每个供应商都发布自己的企业MIB用于电源管理和监控。通常,来自同一供应商的所有产品都实现相同的企业MIB。添加一个新的派生类以支持新的供应商MIB需要定义一个函数,将插座号转换为SNMP OID,并定义要写入以打开和关闭插座的值。该设计应能够实现更复杂的交互,如果定义了以需要它的方式的供应商MIB。

市场研究报告表明PDU市场细分在以下公司之间(按市场份额降序排列)

  • APC Corp.

  • CyberPower Systems Inc.

  • Eaton Corp.

  • Emerson Network Power

  • Raritan Inc.

  • Server Technology Inc.

  • AFCO Systems

  • Enlogic Systems LLC

  • Geist Ltd.

  • Hewlett-Packard Co.

  • Racktivity NV.

在首次实施中,SNMP电源驱动程序将至少支持3个最主要的供应商 - APC、CyberPower和Eaton/Pulizzi。

备选方案

没有明确的替代机制来与智能PDU接口。从CLI终端或Web界面抓取人类可读的数据听起来是个坏主意。

基于SNMP的方法的优点是

  • MIB倾向于成为供应商所有产品都实现的一种通用接口。MIB接口不易受到产品之间变化的影响。

  • 发布MIB接口后,不会以向后不兼容的方式更改它。MIB接口不易受到固件版本之间变化的影响。

  • 通常,供应商MIB是已发布的且可免费获得的。

存在将MIB对象的符号表示转换为MIB无关的OID形式的选项。

  • Net-SNMP包带有snmptranslate命令行工具,可以将任何MIB对象转换为OID。

  • libsmi包含一个名为smidump的工具,可用于将MIB定义转换为具有某种层次结构的Python字典。

  • 纯Python包PySMI能够将MIB文件解析为JSON文档或Python模块,PySNMP可以轻松地使用它。PySMI包带有mibdump.py工具,可用于在命令行上进行MIB转换,类似于snmptranslate所做的那样。

  • 当前的PySNMP将PySMI作为依赖项,因此PySNMP将在需要时自动调用PySMI来解析MIB。

请注意,这些方法是重量级的解决方案。例如,仅解析APC供应商MIB涉及创建2671个字典的层次结构来表示OID。实际上只需要一个OID。

建议的解决方案是从自动生成的输出中手动提取仅需要的OID定义。这可行,因为会生成OID的符号表示。手动传输一次完成:已发布的MIB是不可变的,并且OID的地址和语义永远不会改变。结果是轻量级的,不会损失功能。

数据模型影响

在创建Ironic裸机节点时,将附加其他属性到节点对象

  • snmp_driver - 用于接口的电源驱动程序类。这将标识要使用的特定于供应商的MIB接口。

  • snmp_protocol - 要使用的SNMP协议版本:v1、v2c或v3

  • snmp_address - PDU上运行的SNMP代理的主机名或IP地址。

  • snmp_community - SNMP管理器(例如Ironic SNMP驱动程序)和SNMP代理(在PDU上)之间共享的写入SNMP社区名称。

  • snmp_outlet - 电源设备上的电源插座号。

这些属性将与其他实例数据一起传递到Ironic SNMP驱动程序,并用于生成SNMP管理操作以实现所需的电源操作。

对于完整的SNMPv3支持,可能需要将其他属性添加到节点对象。

REST API 影响

无。

驱动程序 API 影响

此驱动程序将实现完整的电源驱动程序接口。电源驱动程序功能与部署或启动设备管理是正交的,并且不会实现这些接口。将实现一个新的Ironic驱动程序类,该类从base.BaseDriver派生,以将现有的PXE启动设备配置和部署驱动程序与新的SNMP电源驱动程序结合起来。

Nova 驱动程序影响

无。

安全影响

提供对电源管理的访问具有明显的含义,但这些含义在一种机制与另一种机制之间没有实质性的差异。可以认为PDU插座提供的对设备的访问比其他方式可以从Ironic访问的设备更多。

如果用户能够影响与其节点关联的属性的变化,则有可能影响系统中其他设备的电源。这与其他的电源机制没有区别。

使用SNMP协议版本3通过使用加密来提高安全性。SNMP v3还增加了通过身份验证选项来提高安全性的可能性。这将提供高于其他电源驱动程序的安全性,但需要Ironic管理身份验证凭据。作为此初始规范的一部分,不支持电源驱动程序身份验证。

其他最终用户影响

提供对智能PDU插座的远程控制会产生对连接到智能PDU的电源线的依赖关系。为了使用插座进行电源控制,必须准确维护裸机节点和电源插座之间的映射。但是,这与部署智能PDU的任何其他场景没有区别。

可扩展性影响

可扩展性负载与使用网络协议进行电源控制的其他机制没有区别。

性能影响

无。

其他部署者影响

此驱动程序不会在默认配置中启用。

要在部署中启用此驱动程序,需要将特定于驱动程序的数据作为裸机节点属性提供。还需要确定电源插座到裸机节点的映射。

开发人员影响

不应影响其他Ironic开发活动。

实现

负责人

主要负责人

<stigtelfer>

欢迎其他贡献者的协助。

工作项

  • 开发框架和基本类SNMP电源驱动程序。

  • 添加派生类以与各种PDU供应商MIB接口。

  • 调查实施第三方CI以进行PDU硬件的可行性。

  • 调查实施Tempest的虚拟PDU的可行性。

依赖项

此项目将依赖于PySNMP模块。可以放宽依赖关系,使其成为仅在配置启用时应用的动态运行时依赖关系。这将还能够在不导入PySNMP的情况下进行单元测试。

测试

标准驱动程序单元测试可以轻松地移植以应用于新的SNMP驱动程序。

驱动程序模块由驱动程序的实施者在生产中使用。如果该驱动程序被接受到项目中,那么该团队建议在未来的Ironic开发周期中支持和维护它。

该模块将在现场使用的所有可用PDU设备(APC、Teltronix)上进行测试和使用。将调查实施用于PDU测试的第三方CI基础设施的可行性,并在可能的情况下创建它。

来自不同站点拥有来自不同供应商的PDU的其他合作者将为增加测试覆盖率和限定其他PDU硬件做出宝贵的贡献。

从理论上讲,可以创建类似于假SSH驱动程序的虚拟PDU的Tempest套件。这种测试方法取决于在测试虚拟机上创建SNMP代理以及将虚拟电源插座与虚拟机关联的能力。欢迎审查人员对实现此概念的想法。

文档影响

需要详细描述驱动程序参数。列出经过测试和限定的PDU硬件也将有所帮助。此外,关于如何配置来自各种供应商的PDU的任何简要说明(以wiki形式)将很有价值。

参考资料