Управління серверів HP ProLiant через відкриті REST API або «iLO на стероїдах»

Вступ від HP:ця публікація написана одним з наших замовників, який з обов'язку служби побажав залишитися анонімним. Усі збіги імен і айпишников вважати випадковими. Спробувати зробити те ж саме можна в будь-який час в нашому демо-центрі в Москві — бажаючих просимо писати коментарі.

Вітаю. Мене звуть Едуард, і я системний адміністратор в невеликій компанії, яка аутсорсит адміністрування ІТ-інфраструктури. Кхм… Вже схоже на клуб анонімних когось з проблемами? Ну да ладно, одна цікава проблема у нас дійсно була, а сьогодні ми розповімо, як ми з нею зіткнулися, і як випадково її вирішили.


Для початку трохи передісторії. Всі ж пам'ятають, як весело було админить віддалене залізо раніше, років 5-8 тому? Пишемо заявку інженерам в ДЦ, чекаємо, коли вони підключать KVM, налаштовуємо BIOS/CMOS, виставляємо завантаження з мережі, ставимо систему (це добре, якщо хтось добрий вже написав генератор preseed/kickstart-файлів, і в ДЦ є DHCP/PXE сервер). А потім у нас на всіх серверах з'явився ipmi (ну з часом). Ох, як ми раділи перший час!

ipmitool -U user -P password power up -H XXX
ipmitool -U user -P password password bootdev pxe -H XXX
ipmitool -U user -P password power reset -H XXX

І сервер вже начебто ставить ОС. Залишається тільки спостерігати за цим в консолі, якщо нудно. Засмучувало тільки те, що BIOS все одно доводилося оновлювати руками і настроювати (ну там HT/VT-d включити, хоча б). У підсумку всі сервери були налаштовані по-різному, залежно від того, в якому кварталі їх ставили. Ну ви ж розумієте, що сервери завжди ставив наймолодший адмін.

Коли ми знаходили щось критичне – ми йшли і руками перемикали налаштування. Бардак, та й тільки. Але взагалі все це нас влаштовувало до того, як з нами трапилася історія, про яку я сьогодні і буду розповідати.

Варто згадати, що частина клієнтів ми розміщуємо прямо на своєму залозі (точніше на виртуалках на цьому залізі, яке керується через <закреслено печаткою з великими літерами NDA>). Ну щоб вам було легше уявити – наша система сильно схожа на OpenStack. І ось, в один прекрасний день, до нас прийшов замовник і попросив «на його залозі зробити систему для управління віртуальними машинами в приватному хмарі». Ми зраділи, почали йому показувати своє рішення (вже після підписання контракту і ТЗ), йому все сподобалося. Все сподобалося, менеджери вже відкривають шампанське (а треба сказати, що контракт за нашими мірками був дуже непоганий). І тут клієнт показує пальцем в пункт ТЗ і запитує – «а з цим як?». Сидять адміни і здивовано дивляться в цей пункт – «нові сервери повинні автоматично додаватися в хмару після інвентаризації, встановлення в стійку і підключення мережі живлення». Ми почали показувати – ось дивіться, ми записуємо сервер сюди (1c), додаємо його mac-адресу ось сюди (самописні web-морда для управління сервером dhcp і pxe), запускаємо скрипт, сервер завантажується з мережі, система ставиться (ми з полегшенням видихнули, зрозумівши, що хоча б система ставиться сама), потім ми ловимо сервер при перезавантаженні, посилено тиснемо клавішу Del… загалом, представник клієнта подивився на це, почухав потилицю, походив по переговорні, зібрався з думками і промовив: «Так де ж тут автоматично? Ось давайте викинемо всі, крім 1С, все одно туди бухгалтери сервер вносити будуть, а не я, і того місця, куди ви mac-адресу записували». Ну і незабаром після цього пішов, додавши, що сподівається на те, що завдання ми все вирішимо.

Потім ми, як зазвичай, ТЗ вирішили прочитати. Знайшли там всякі цікаві пункти, які ми (ну ті, хто робив задачу, а не ті, хто ТЗ підписував і переказував його нам) побачили вперше. Наприклад, моніторинг температури в обхід ОС, моніторинг споживання електрики, автоматичне налаштування BIOS… Почали розмірковувати. Спочатку схилялися до думки, що ipmitool все це може. Потім представили, як все це буде виглядати. Подумали про те, як оновлювати налаштування, про моніторинг датчиків… загалом, розійшлися на вихідні з завданням «вивчити весь гугл на предмет альтернатив ipmi, які можуть».

Приходимо в понеділок, всі сумні, злі. А один адмін сидить і посміхається. Логічним було пристати до нього з розпитуваннями на тему того, навіщо він читає ithappens, коли у нас така біда. Як виявилося, він радів з приводу того, що читав не ithappens, а Redfish server management spec v 1.0 (читати). Шанували всі разом вголос, злитися перестали. Redfish виявився саме тим, що нам потрібно. Взяли менеджера, змусили його обдзвонювати всіх виробників серверів, щоб знайти залізяку, в якій Redfish реалізований. Приходять через годину і сміється, показує пальцем на коробку біля входу і каже «все, я знайшов». Власне, коробка виявилася коробкою від HP Proliant Gen9. Сервер ми знайшли, повернули в лабораторію (і хто взагалі здогадався новенький невивчений сервер відразу в ДЦ везти...) і приступили до знайомства з HP REST API (яка і є реалізацією Redfish в серверах HP).

Так як ми адміни (це потім вже нам дали питониста і він нам все написав і зробив гарний web-інтерфейс), то першим ділом ми сіли писати sh-ники, які будуть робити те, що нам потрібно. Звичайно, ми б не радили ходити в Rest API консольним curl-му і генерувати JSON через echo (ну або хоча б потім не показуйте нікому це), але ось поділитися прикладами взаємодії з HP ProLiant REST API будемо раді (тим більше, що самі представники HP нас про це і попросили).

Можливостей там повно насправді, документації 2 сотні сторінок списку об'єктів та короткого їхнього опису. Ми насамперед намагалися виконати свої основні завдання, як proof-of-concept. Звичайно, частина з них можна робити і через IPMI, але ми вирішили використовувати один інструмент, саме API.

Першим ділом (ну добре, другим, після підключення до сервера в стійці і після того, як HP iLO отримає IP-адреса), прописуємо всі налаштування BIOS:

# echo '{"AcpiRootBridgePxm":"Enabled","AcpiRtcSupport":"Disabled","AcpiSlit":"Enabled","AdjSecPrefetch":"Enabled","AdminEmail":"","AdminName":"","AdminOtherInfo":"","AdminPassword":"","AdminPhone":"","AdvancedMemProtection":"AdvancedEcc","AsrStatus":"Enabled","AsrTimeoutMinutes":"10","AssetTagProtection":"Unlocked","AttributeRegistry":"HpBiosAttributeRegistryP86.1.1.0","AutoPowerOn":"RestoreLastState","BootMode":"LegacyBios","BootOrderPolicy":"RetryIndefinitely","ChannelInterleaving":"Enabled","CollabPowerControl":"Enabled","ConsistentDevNaming":"LomsOnly","CustomPostMessage":"","DcuIpPrefetcher":"Enabled","DcuStreamPrefetcher":"Enabled","Description":"This is the Platform/BIOS Configuration (RBSU) Current Settings","Dhcpv4":"Enabled","DynamicPowerCapping":"Auto","DynamicPowerResponse":"Fast","EmbNicEnable":"Enabled","EmbSata1Enable":"Enabled","EmbSata2Enable":"Enabled","EmbVideoConnection":"Auto","EmbeddedDiagnostics":"Enabled","EmbeddedDiagsMode":"Auto","EmbeddedSata":"Raid","EmbeddedUefiShell":"Enabled","EmsConsole":"Disabled","EnergyPerfBias":"BalancedPerf","EraseUserDefaults":"No","ExtendedAmbientTemp":"Disabled","ExtendedMemTest":"Disabled","F11BootMenu":"Enabled","FanFailPolicy":"Shutdown","FanInstallReq":"EnableMessaging","HwPrefetcher":"Enabled","IntelDmiLinkFreq":"Auto","IntelPerfMonitoring":"Disabled","IntelProcVtd":"Enabled","IntelQpiFreq":"Auto","IntelQpiPowerManagement":"Enabled","IntelTxt":"Disabled","IntelligentProvisioning":"Enabled","Ipv4Address":"0.0.0.0","Ipv4Gateway":"0.0.0.0","Ipv4PrimaryDNS":"0.0.0.0","Ipv4SecondaryDNS":"0.0.0.0","Ipv4SubnetMask":"0.0.0.0","MaxMemBusFreqMHz":"Auto","MaxPcieSpeed":"MaxSupported","MemFastTraining":"Enabled","MinProcIdlePkgState":"C6Retention","MinProcIdlePower":"C6","MixedPowerSupplyReportngi":"Enabled","Modified":"2015-02-12T20:16:59+00:00","Name":"BIOS Current Settings","NetworkBootRetry":"Enabled","NicBoot1":"NetworkBoot","NicBoot2":"Disabled","NmiDebugButton":"Enabled","NodeInterleaving":"Disabled","OldAdminPassword":"","OldPowerOnPassword":"","PciBusPadding":"Enabled","PostF1Prompt":"Delayed20Sec","PowerButton":"Enabled","PowerOnDelay":"None","PowerOnLogo":"Enabled","PowerOnPassword":"","PowerProfile":"BalancedPowerPerf","PowerRegulator":"DynamicPowerSavings","PreBootNetwork":"EmbNic","ProcCoreDisable":0,"ProcHyperthreading":"Enabled","ProcNoExecute":"Enabled","ProcTurbo":"Enabled","ProcVirtualization":"Disabled","ProcX2Apic":"Enabled","ProductId":"777424-AA1","QpiBandwidthOpt":"Balanced","QpiSnoopConfig":"Standard","RedundantPowerSupply":"BalancedMode","RemovableFlashBootSeq":"ExternalKeysFirst","RestoreDefaults":"No","RestoreManufacturingDefaults":"No","RomSelection":"CurrentRom","SataSecureErase":"Disabled","SaveUserDefaults":"No","SecureBoot":"Disabled","SerialConsoleBaudRate":"115200","SerialConsoleEmulation":"Vt100Plus","SerialConsolePort":"Auto","SerialNumber":"8CW4340081","ServerAssetTag":"","ServerName":"","ServerOtherInfo":"","ServerPrimaryOs":"","ServiceEmail":"","ServiceName":"","ServiceOtherInfo":"","ServicePhone":"","SettingsResult":{"ETag":"","Messages":[{"MessageArgs":[],"MessageID":"Base.1.0:Success"}],"Time":""},"Sriov":"Enabled","ThermalConfig":"OptimalCooling","ThermalShutdown":"Enabled","TimeZone":"Utc0","TpmBinding":"Disabled","TpmOperation":"Disable","TpmState":"NotPresent","TpmType":"NoTpm","TpmVisibility":"Visible","Type":"HpBios.1.0.0","UefiOptimizedBoot":"Enabled","UefiPxeBoot":"Auto","UefiShellBootOrder":"Disabled","UefiShellStartup":"Disabled","UefiShellStartupLocation":"AttachedMedia","UefiShellStartupUri":"","UrlBootFile":"","Usb3Mode":"Auto","UsbBoot":"Enabled","UsbControl":"UsbEnabled","UtilityLang":"English","VideoOptions":"BothVideoEnabled","VirtualInstallDisk":"Disabled","VirtualSerialPort":"Com2Irq3","WakeOnLan":"Enabled","links":{"BaseConfigs":{"href":"/rest/v1/systems/1/bios/BaseConfigs"},"Boot":{"href":"/rest/v1/systems/1/bios/Boot"},"Mappings":{"href":"/rest/v1/systems/1/bios/Mappings"},"Settings":{"href":"/rest/v1/systems/1/bios/Settings"}}}' | curl -v -k -X PATCH https://Administrator:Password@192.168.2.250/rest/v1/systems/1/Bios/Settings -H "Content-Type: application/json" --data-binary @- ; echo


Навчимося керувати живленням. Ребут «по кнопці»:

# echo '{"Action":"Reset","ResetType":"ForceRestart"}' | curl -v -k -X POST https://Administrator:Password@192.168.2.250/rest/v1/systems/1 -H "Content-Type: application/json" --data-binary @- ; echo

«Висмикуємо кабель з розетки»:

# echo '{"Action":"Reset","ResetType":"ForceOff"}' | curl -v -k -X POST https://Administrator:Password@192.168.2.250/rest/v1/systems/1 -H "Content-Type: application/json" --data-binary @- ; echo

Включаємо сервер:

# echo '{"Action":"Reset","ResetType":"On"}' | curl -v -k -X POST https://Administrator:Password@192.168.2.250/rest/v1/systems/1 -H "Content-Type: application/json" --data-binary @- ; echo

Відправляємо інженера «натиснути кнопку живлення»:

# echo '{"Action":"Reset","ResetType":"PushPowerButton"}' | curl -v -k -X POST https://Administrator:D3BFF4AE@192.168.2.250/rest/v1/systems/1 -H "Content-Type: application/json" --data-binary @- ; echo

Запитаємо у сервера, хто він такий:

# curl -v -k -X GET https://Administrator:Password@192.168.2.250/rest/v1 -H "Content-Type: application/json"

{"Name":"HP RESTful Root Service","Oem":{"Hp":{"Manager":[{"DefaultLanguage":"en","FQDN":"ILO8CW4340081.","HostName":"ILO8CW4340081","Languages":[{"Language":"en","TranslationName":"English","Version":"2.02"}],"ManagerFirmwareVersion":"2.02","ManagerType":"iLO 4"}],"Sessions":{"CertCommonName":"ILO8CW4340081","KerberosEnabled":false,"LDAPAuthLicenced":false,"LDAPEnabled":false,"LocalLoginEnabled":true,"LoginFailureDelay":0,"LoginHint":{"Hint":"POST to /Sessions to login using the following JSON object:","HintPOSTData":{"Password":"password","UserName":"username"}},"SecurityOverride":true,"ServerName":""},"Type":"HpiLOServiceExt.0.9.5","links":{"Providers":{"href":"/rest/v1/Providers"}}}},"ServiceVersion":"0.9.5","Time":"2015-05-06T18:01:55Z","Type":"ServiceRoot.0.9.5","links":{"AccountService":{"href":"/rest/v1/AccountService"},"Chassis":{"href":"/rest/v1/Chassis"},"Managers":{"href":"/rest/v1/Managers"},"Registries":{"href":"/rest/v1/Registries"},"Schemas":{"href":"/rest/v1/Schemas"},"Sessions":{"href":"/rest/v1/Sessions"},"Systems":{"href":"/rest/v1/Systems"},"self":{"href":"/rest/v1/root"}}}

PATCH-запитом в цю ж ручку можна змінити інформацію про сервер всередині iLo.

Запитаємо MAC-адреси сервера (так, в результаті ми пішли далі і DHCP-сервер сам проводив інвентаризацію нових серверів, якщо знаходив незнайомий iLO в окремому VLAN-е – для iLO ми видавали динамічні адресу, а потім вже заводили запису про статичних адрес для мережевих карт сервера інтерфейсу користувача iLo):

# curl -v -k -X GET https://Administrator:Password@192.168.2.250/rest/v1/systems/1 -H "Content-Type: application/json"

{"AvailableActions":[{"Action":"Reset","Capabilities":[{"AllowableValues":["On","ForceOff","ForceRestart","Nmi","PushPowerButton"],"PropertyName":"ResetType"}]}],"Bios":{"Current":{"VersionString":"P86 v1.30 (09/04/2014)"}},"Boot":{"BootSourceOverrideEnabled":"Disabled","BootSourceOverrideSupported":["None","Floppy","Cd","Hdd","Usb","Utilities","Diags","BiosSetup","Pxe","UefiShell","UefiTarget"],"BootSourceOverrideTarget":"None","UefiTargetBootSourceOverride":"None","UefiTargetBootSourceOverrideSupported":["NIC.LOM.1.1.IPv4","NIC.LOM.1.1.IPv6"]},"Description":"Computer System View","HostCorrelation":{"HostMACAddress":["14:58:d0:d3:20:8e","14:58:d0:d3:20:8f"],"HostName":"","IPAddress":[""]},"IndicatorLED":"Off","Manufacturer":"HP","Memory":{"TotalSystemMemoryGB":32},"Model":"ProLiant DL120 Gen9","Name":"Computer System","Oem":{"Hp":{"AvailableActions":[{"Action":"PowerButton","Capabilities":[{"AllowableValues":["Press","PressAndHold"],"PropertyName":"PushType"},{"AllowableValues":["/Oem/Hp"],"PropertyName":"Target"}]}],"Bios":{"Backup":{"Date":"v1.30 (09/04/2014)","Family":"P86","VersionString":"P86 v1.30 (09/04/2014)"},"Bootblock":{"Date":"","Family":"P86","VersionString":"P86 "},"Current":{"Date":"09/04/2014","Family":"P86","VersionString":"P86 v1.30 (09/04/2014)"},"UefiClass":2},"PowerAllocationLimit":900,"PowerAutoOn":"Restore","PowerOnDelay":"Minimum","PowerRegulatorMode":"Dynamic","PowerRegulatorModesSupported":["OSControl","Dynamic","Max","Min"],"Type":"HpComputerSystemExt.0.10.0","VirtualUUID":null,"links":{"BIOS":{"href":"/rest/v1/systems/1/bios"},"PCIDevices":{"href":"/rest/v1/Systems/1/PCIDevices"},"PCISlots":{"href":"/rest/v1/Systems/1/PCISlots"},"SecureBoot":{"href":"/rest/v1/Systems/1/SecureBoot"}}}},"Power":"Off","Processors":{"Count":1,"ProcessorFamily":"Intel® Xeon® CPU E5-2660 v3 @ 2.60 GHz"},"SKU":"777424-AA1","SerialNumber":"8CW4340081","Status":{"Health":"OK","State":"Disabled"},"SystemType":"Physical","Type":"ComputerSystem.0.9.5","UUID":"34373737-3432-4338-5734-333430303831","links":{"Chassis":[{"href":"/rest/v1/Chassis/1"}],"Manager":[{"href":"/rest/v1/Managers/1"}],"self":{"href":"/rest/v1/Systems/1"}}}

З попереднього JSON-а ми витягали також і кількість пам'яті з моделлю CPU, потім розробники зробили інтеграцію з 1С, сервер відправляв дані про себе і туди. Тут же ми визначали і версію BIOS, щоб лаятися про застарілі (або просто відрізняються за кластеру) версіях.

Ще через REST API можна зняти показання метрик харчування (на жаль, не у всіх «рівнях» ліцензії iLO):

# curl -v -k -X GET https://Administrator:Password@192.168.2.250/rest/v1/chassis/1/PowerMetrics -H "Content-Type: application/json" 

Ще ми знайшли якусь моторошну ручку, яка описує стан сервера – обороти вентилятора, температуру, стан різних залозок всередині сервера.

# curl -v -k -X GET https://Administrator:Password@192.168.1.235/rest/v1/Chassis/1/ThermalMetrics -H "Content-Type: application/json" 

{"Fans":[{"CurrentReading":33,"FanName":"Fan 1","Oem":{"Hp":{"Location":"System","Type":"HpServerFan.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Percent"},{"CurrentReading":33,"FanName":"Fan 2","Oem":{"Hp":{"Location":"System","Type":"HpServerFan.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Percent"},{"CurrentReading":33,"FanName":"Fan 3","Oem":{"Hp":{"Location":"System","Type":"HpServerFan.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Percent"},{"CurrentReading":33,"FanName":"Fan 4","Oem":{"Hp":{"Location":"System","Type":"HpServerFan.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Percent"},{"CurrentReading":33,"FanName":"Fan 5","Oem":{"Hp":{"Location":"System","Type":"HpServerFan.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Percent"},{"CurrentReading":33,"FanName":"Fan 6","Oem":{"Hp":{"Location":"System","Type":"HpServerFan.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Percent"}],"Name":"ThermalMetrics","Temperatures":[{"Context":"Ambient","CurrentReading":21,"LowerThresholdCritical":46,"LowerThresholdNonCritical":42,"Name":"01-Inlet Ambient","Oem":{"Hp":{"LocationXmm":11,"LocationYmm":0,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"CPU","CurrentReading":40,"LowerThresholdCritical":0,"LowerThresholdNonCritical":70,"Name":"02-CPU 1","Oem":{"Hp":{"LocationXmm":7,"LocationYmm":9,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"CPU","CurrentReading":40,"LowerThresholdCritical":0,"LowerThresholdNonCritical":70,"Name":"03-CPU 2","Oem":{"Hp":{"LocationXmm":12,"LocationYmm":9,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"GPU","CurrentReading":27,"LowerThresholdCritical":0,"LowerThresholdNonCritical":87,"Name":"04-P1 DIMM 1-2","Oem":{"Hp":{"LocationXmm":10,"LocationYmm":10,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"GPU","CurrentReading":0,"LowerThresholdCritical":0,"LowerThresholdNonCritical":87,"Name":"05-P1 DIMM 3-4","Oem":{"Hp":{"LocationXmm":5,"LocationYmm":10,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"State":"Absent"},"Units":"Celsius"},{"Context":"GPU","CurrentReading":28,"LowerThresholdCritical":0,"LowerThresholdNonCritical":87,"Name":"06-P2 DIMM 1-2","Oem":{"Hp":{"LocationXmm":14,"LocationYmm":10,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"GPU","CurrentReading":0,"LowerThresholdCritical":0,"LowerThresholdNonCritical":87,"Name":"07-P2 DIMM 3-4","Oem":{"Hp":{"LocationXmm":11,"LocationYmm":10,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"State":"Absent"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":0,"LowerThresholdCritical":0,"LowerThresholdNonCritical":60,"Name":"08-HD Max","Oem":{"Hp":{"LocationXmm":4,"LocationYmm":2,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"State":"Absent"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":41,"LowerThresholdCritical":0,"LowerThresholdNonCritical":105,"Name":"09-Chipset","Oem":{"Hp":{"LocationXmm":7,"LocationYmm":13,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":40,"LowerThresholdCritical":0,"LowerThresholdNonCritical":0,"Name":"10-P/S 1","Oem":{"Hp":{"LocationXmm":1,"LocationYmm":14,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":0,"LowerThresholdCritical":0,"LowerThresholdNonCritical":0,"Name":"11-P/S 2","Oem":{"Hp":{"LocationXmm":2,"LocationYmm":14,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"State":"Absent"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":30,"LowerThresholdCritical":120,"LowerThresholdNonCritical":115,"Name":"12-VR P1","Oem":{"Hp":{"LocationXmm":7,"LocationYmm":8,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":30,"LowerThresholdCritical":120,"LowerThresholdNonCritical":115,"Name":"13-VR P2","Oem":{"Hp":{"LocationXmm":12,"LocationYmm":8,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":26,"LowerThresholdCritical":120,"LowerThresholdNonCritical":115,"Name":"14-VR P1 Zone","Oem":{"Hp":{"LocationXmm":7,"LocationYmm":7,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":25,"LowerThresholdCritical":120,"LowerThresholdNonCritical":115,"Name":"15-VR P2 Zone","Oem":{"Hp":{"LocationXmm":12,"LocationYmm":7,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":26,"LowerThresholdCritical":120,"LowerThresholdNonCritical":115,"Name":"16-VR P1 Mem","Oem":{"Hp":{"LocationXmm":8,"LocationYmm":7,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":26,"LowerThresholdCritical":120,"LowerThresholdNonCritical":115,"Name":"17-VR P2 Mem","Oem":{"Hp":{"LocationXmm":13,"LocationYmm":7,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":0,"LowerThresholdCritical":0,"LowerThresholdNonCritical":60,"Name":"18-Storage Batt","Oem":{"Hp":{"LocationXmm":0,"LocationYmm":7,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"State":"Absent"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":30,"LowerThresholdCritical":85,"LowerThresholdNonCritical":80,"Name":"19-iLO Zone","Oem":{"Hp":{"LocationXmm":12,"LocationYmm":13,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":30,"LowerThresholdCritical":105,"LowerThresholdNonCritical":100,"Name":"20-System Board","Oem":{"Hp":{"LocationXmm":7,"LocationYmm":14,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":28,"LowerThresholdCritical":105,"LowerThresholdNonCritical":100,"Name":"21-System Board","Oem":{"Hp":{"LocationXmm":11,"LocationYmm":13,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":24,"LowerThresholdCritical":127,"LowerThresholdNonCritical":126,"Name":"22-P/S Zone","Oem":{"Hp":{"LocationXmm":4,"LocationYmm":9,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":28,"LowerThresholdCritical":0,"LowerThresholdNonCritical":126,"Name":"23-System Board","Oem":{"Hp":{"LocationXmm":4,"LocationYmm":15,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":29,"LowerThresholdCritical":0,"LowerThresholdNonCritical":126,"Name":"24-System Board","Oem":{"Hp":{"LocationXmm":9,"LocationYmm":15,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":29,"LowerThresholdCritical":0,"LowerThresholdNonCritical":126,"Name":"25-System Board","Oem":{"Hp":{"LocationXmm":10,"LocationYmm":15,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"Expansion Bay","CurrentReading":0,"LowerThresholdCritical":0,"LowerThresholdNonCritical":100,"Name":"26-PCI 1","Oem":{"Hp":{"LocationXmm":4,"LocationYmm":13,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"State":"Absent"},"Units":"Celsius"},{"Context":"Expansion Bay","CurrentReading":0,"LowerThresholdCritical":0,"LowerThresholdNonCritical":100,"Name":"27-PCI 2","Oem":{"Hp":{"LocationXmm":10,"LocationYmm":13,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"State":"Absent"},"Units":"Celsius"},{"Context":"Expansion Bay","CurrentReading":0,"LowerThresholdCritical":0,"LowerThresholdNonCritical":100,"Name":"28-PCI 3","Oem":{"Hp":{"LocationXmm":10,"LocationYmm":13,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"State":"Absent"},"Units":"Celsius"},{"Context":"Expansion Bay","CurrentReading":26,"LowerThresholdCritical":0,"LowerThresholdNonCritical":126,"Name":"29-PCI 1 Zone","Oem":{"Hp":{"LocationXmm":4,"LocationYmm":15,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"Expansion Bay","CurrentReading":24,"LowerThresholdCritical":0,"LowerThresholdNonCritical":126,"Name":"30-PCI 2 Zone","Oem":{"Hp":{"LocationXmm":10,"LocationYmm":15,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"Expansion Bay","CurrentReading":25,"LowerThresholdCritical":0,"LowerThresholdNonCritical":126,"Name":"31-PCI 3 Zone","Oem":{"Hp":{"LocationXmm":10,"LocationYmm":15,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"Health":"OK","State":"Enabled"},"Units":"Celsius"},{"Context":"Expansion Bay","CurrentReading":0,"LowerThresholdCritical":0,"LowerThresholdNonCritical":100,"Name":"32-LOM Card","Oem":{"Hp":{"LocationXmm":10,"LocationYmm":13,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"State":"Absent"},"Units":"Celsius"},{"Context":"Expansion Bay","CurrentReading":0,"LowerThresholdCritical":0,"LowerThresholdNonCritical":126,"Name":"33-I/O Board","Oem":{"Hp":{"LocationXmm":10,"LocationYmm":15,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"State":"Absent"},"Units":"Celsius"},{"Context":"System Board","CurrentReading":0,"LowerThresholdCritical":0,"LowerThresholdNonCritical":100,"Name":"34-LOM","Oem":{"Hp":{"LocationXmm":6,"LocationYmm":14,"Type":"HpSeaOfSensors.0.9.5"}},"Status":{"State":"Absent"},"Units":"Celsius"}],"Type":"ThermalMetrics.0.9.5","links":{"self":{"href":"/rest/v1/Chassis/1/ThermalMetrics"}}}

А ще знайшли об'єкт, який говорить про стан сервера в цілому (ОК/fail) і чим він зараз займається (у нашому прикладі він завантажувався):

# curl -v -k -X GET https://Administrator:Password@192.168.1.235/rest/v1/Chassis/1 -H "Content-Type: application/json" 

...
"Status":{"Health":"OK","State":"Starting"}
...

Загалом, sh-нік в результаті ми написали і віддали його розробнику. Він посміявся над нами, ми його за це полаяли, пригрозили рута відібрати… Але зате він потім написав модуль в наш хмарка, який вміє додавати і управляти серверами через Redfish (і HP REST API, відповідно). Ну а замовлення ми виконали.

Напевно, пора закруглятися. Розповімо про тих, хто грав головні ролі у всій це історії.

  • Звичайно ж, саму головну роль ми відведемо сервера ProLiant DL60 Gen9;
  • Ще хотілося б сказати спасибі утиліті hprest, strace-дамп якій допоміг нам зрозуміти, з якого боку взагалі до цієї коробки підступитися з консолі;
  • Документація по HP Restfull API;
  • Python-ProLiant-SDK, який ми відразу не знайшли, але який допоміг зробити production-рішення поверх REST API;
  • Опис специфікації DMTF.org Redfish — як стверджує HP, багато в чому ґрунтується на розробках власних REST API для HP ProLiant
  • І, звичайно ж, компанія HP, яка першою запустила в продаж сервери, що підтримують Redfish, за що ми їм вдячні.
Спасибі за увагу!

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.