Cisco UCS Python SDK脚本,用于查询固件版本

时间:2015-11-13 23:34:09

标签: python cisco ucs

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

Cisco UCS descrition: http://www.cisco.com/c/en/us/products/servers-unified-computing/index.html

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

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

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

我只想为每个服务器刀片,机箱和结构互连提取名称,型号和固件版本。因此,使用思科提供的SDK和上面链接的大部分脚本,我的脚本能够登录到我们的UCS并查询A和B结构互连,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个。有些有两个刀片,有些有6个,等等。一旦我越过第一个机箱并试图增加到机箱-2,脚本就会无限期地暂停。这可能无关紧要,但我还需要考虑机箱和插槽可以编号为三位数。

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

如果我错过任何相关信息,我表示歉意。我很乐意回答任何问题。 :d

1 个答案:

答案 0 :(得分: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

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