Сценарий Cisco UCS Python SDK для запроса версий встроенного ПО
Я работал над тем, чтобы научить себя величию Python, и один из лучших способов для меня - это делать. Итак, один из многих проектов, которые я предпринял, заключается в извлечении информации о встроенном ПО из наших сред Cisco UCS. После обнаружения, что Cisco предоставляет Python SDK для запроса UCS; Я использовал это в качестве отправной точки. Ниже приведены ссылки для разъяснения, что такое UCS и SDK UCS Python.
Описание Cisco UCS: http://www.cisco.com/c/en/us/products/servers-unified-computing/index.html
SDK Cisco UCS Python: https://communities.cisco.com/docs/DOC-37174
Сценарий, на который ссылается сайт разработчиков Cisco: https://sreeninet.wordpress.com/2014/09/20/cisco-ucs-automation-using-python-sdk/ <- это то место, куда пришло большинство кода в моем сценарии от главных реквизитов до Сриниваса.
Мой скрипт: http://pastebin.com/txjnHi9q
Я просто хочу получить имя, модель и версию прошивки для каждого из блейд-серверов, шасси и межкомпонентных соединений. Таким образом, используя SDK, предоставленный Cisco, и большую часть сценария, указанного выше, мой сценарий может войти в нашу UCS и запросить межкомпонентные соединения A и B Fabric, диспетчера 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. Я попытался использовать тот же метод для получения имени, модели и прошивки Blade Chassis и Blade Server, но именно здесь все становится сложнее для этого новичка.
Глядя на строку 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
1 ответ
Я уверен, что вы уже нашли решение своей проблемы, но я наткнулся на этот пост в поисках чего-то похожего.
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':
Теперь я получил объект 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.