2

我一直在努力训练自己掌握 Python 的伟大之处,而我学习的最好方法之一就是边做边学。因此,我参与的众多项目之一是从我们的 Cisco UCS 环境中提取固件信息。发现Cisco提供了一个Python SDK来查询UCS后;我以此为出发点。下面是用于说明什么是 UCS 和 UCS Python SDK 的链接。

思科 UCS 说明: http ://www.cisco.com/c/en/us/products/servers-unified-computing/index.html

思科 UCS Python SDK: https ://communities.cisco.com/docs/DOC-37174

从 Cisco 开发站点引用的脚本: https ://sreeinet.wordpress.com/2014/09/20/cisco-ucs-automation-using-python-sdk/ <--这是我脚本中大部分代码的来源从,主要道具到 Sreenivas。

我的脚本: http: //pastebin.com/txjnHi9q

我只想提取每个服务器刀片、机箱和结构互连的名称、型号和固件版本。因此,使用 Cisco 提供的 SDK 和上面链接的大部分脚本,我的脚本能够登录到我们的 UCS 并查询 A 和 B Fabric Interconnects、UCS 管理器并获取模型和固件版本。

我的脚本显示与此类似的结果:

UCS Manager Version: 2.2(3f)

Fabric Interconnect A:
Model: N10-S6200
Software Ver: 5.2(3)N2(2.23f)

Fabric Interconnect B:
Model: N10-S6200
Software Ver: 5.2(3)N2(2.23f)

Blade Chassis:
N20-C6508
N20-C6508
Blade Servers:
N20-B6625-1
N20-B6625-1

如上所示,我已成功检索到 Fabric Interconnects 和 UCS Manager 的固件版本。我尝试使用相同的方法来提取刀片机箱和刀片服务器的名称、型号和固件,但对于这个新手来说,事情变得更加困难。

查看上面链接的脚本的第 46 行,它显示了以下代码:

molist = handle.GetManagedObject(None, None, {OrgOrg.DN:"sys/mgmt/fw-system"}

“sys/mgmt/fw-system”是我在尝试获取固件版本时感到困惑的地方。我只能获得第 124 行和第 133 行中引用的刀片和机箱型号,如下所示。

molist = handle.GetManagedObject(None, EquipmentChassis.ClassId())
molist1 = handle.GetManagedObject(None, ComputeBlade.ClassId())

UCS 将刀片的固件存储在“sys/chassis-N/slot-N/mgmt/fw-system”中,其中 N 是机箱和插槽的编号。我试图将机箱 1 增加到机箱 2 -3 -4,依此类推,将插槽 1 增加到插槽 2 -3 -4。这不起作用,因为机箱的数量和每个机箱中的刀片数量并不总是相同的。例如,每个机箱最多可容纳 8 个服务器刀片(插槽),但并非所有机箱都安装了全部 8 个。有些有 2 个刀片,有些有 6 个,等等。一旦我通过第一个机箱并尝试增加到机箱 2,脚本将无限期暂停。这可能无关紧要,但我还需要考虑到机箱和插槽可以以三位数编号。

关于如何在 Python 中进行上述操作的任何想法?

如果我错过了任何相关信息,我深表歉意。我很乐意回答我能回答的任何问题。:D

4

1 回答 1

0

我确定您现在已经找到了解决问题的方法,但是我发现这篇文章正在寻找类似的东西。

思科对其 Python SDK 进行了一些更改,但看起来非常相似。

我从获取所有机箱开始:

from ucsmsdk.ucshandle import UcsHandle
handle = UcsHandle(host, login, pwd)
handle.login()

for chassis in handle.query_classid(class_id="EquipmentChassis"):

查询机箱的孩子找到刀片:

  for chassis_child in handle.query_children(in_mo=chassis):
      if chassis_child.get_class_id() == 'ComputeBlade':

现在我得到了一个 ComputeBlade 对象,里面有很多有用的东西可以放入我们的 CMDB。但是要找到固件版本,我们必须进一步挖掘。首先找到BIOS:

         for blade_part in handle.query_children(in_mo=chassis_child):
             if blade_part.get_class_id() == 'BiosUnit':
                 for bios_part in handle.query_children(in_mo=blade_part):
                     if bios_part.get_class_id() == 'FirmwareRunning':
                         print chassis_child.dn, bios_part.version

.. 这不是很优雅,我希望在 SDK 中找到一种更简单的方法来执行此操作,但我希望它可以帮助其他任何人开始使用 UCSM sdk。

于 2016-10-28T13:15:14.850 回答