2

私は Python の素晴らしさを身につけるために努力してきましたが、私が学ぶための最良の方法の 1 つは実行することです。そのため、私が取り組んできた多くのプロジェクトの 1 つは、Cisco UCS 環境からファームウェア情報を取得することです。シスコが UCS をクエリするための Python SDK を提供していることを発見した後。私はそれを私の出発点として使用しました。以下は、UCS とは何か、および UCS Python SDK を明確にするためのリンクです。

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

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

Cisco dev サイトから参照されたスクリプト: 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

上記のように、ファブリック インターコネクトと 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 にインクリメントしようとすると、スクリプトは無期限に一時停止します。関係ないかもしれませんが、シャーシとスロットの数が 3 桁になる可能性があることも考慮する必要があります。

Python で上記を実行する方法についてのアイデアはありますか?

関連する情報を見逃していた場合は、お詫び申し上げます。できる限りの質問に喜んでお答えします。:D

4

1 に答える 1

0

今までに問題の解決策を見つけたと確信していますが、似たようなものを探してこの投稿に出くわしました.

Cisco は 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':

これで、CMDB に入れる便利なものがたくさんある ComputeBlade オブジェクトを取得できました。しかし、ファームウェアのバージョンを見つけるには、さらに掘り下げる必要があります。最初に 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 に答える