Если инфорация оказалась интересна и/или полезна, не побрезгуйте, оставьте комментарий ;)

пятница, 3 ноября 2017 г.

Загрузка сервера Proliant с загрузочного образа в Virtual Media с помощью PowerShell и REST


Вначале приведу листинг команд целиком:
$HPOVSession = connect-HPOVMgmt -Hostname <OneView IP> -UserName Administrator -Password <Admin password>      Get-HPOVServerProfileTemplate
$DLGen9Template = Get-HPOVServerProfileTemplate -Name "*DL360 Gen9*" | select -First 1
$DLGen9Server = Get-HPOVServer -NoProfile -InputObject $DLGen9Template
$DLGen9Server
$DLGen9ServerProfile = New-HPOVServerProfile -Name "CentOS DL Gen9 Server" -AssignmentType "Server" -Server
$DLGen9Server -Async -ServerProfileTemplate $DLGen9Template
$DLGen9SSOToken = $DLGen9Server |Get-HPOVIloSso -IloRestSession
Disable-HPRESTCertificateAuthentication
$ManagerObjectsSSO = Get-HPRESTDataRaw -Href "/rest/v1/Managers" -Session $DLGen9SSOToken
$ManagerObjectsSSO
foreach ($ManagerObjectSSO in $ManagerObjectsSSO.links.Member.href) {$ManagerObjectData = Get-HPRESTDataRaw -Href $ManagerObjectSSO -Session $DLGen9SSOToken; if ($ManagerObjectData.links.PSObject.Properties.name -Contains 'VirtualMedia') {break}}
$ManagerObjectData
$VMData = Get-HPRESTDataRaw -Href $ManagerObjectData.links.VirtualMedia.href -Session $DLGen9SSOToken
foreach ($VMLink in $VMData.links.Member.href) {$VMObject = Get-HPRESTDataRaw -Href $VMLink -Session $DLGen9SSOToken; if ($VMObject.MediaTypes -contains 'DVD'){break}}
$VMObject
$mountSetting = @{'Image' = $null}
$result = Set-HPRESTData -Href $VMLink -Setting $mountSetting -Session $DLGen9SSOToken -ErrorAction SilentlyContinue
$mountSetting = @{'Image' = 'http://<HTTP Server IP>/isoboot/ubuntu-14.04.4-server-i386.iso'}
$mountSetting
$oem = @{'Hp' = @{'BootOnNextServerReset' =$true}}
$oem
$mountSetting.Add('Oem',$oem)
$mountSetting
$result = Set-HPRESTData -Href $VMLink -Setting
$mountSetting -Session $DLGen9SSOToken
$VMObject = Get-HPRESTDataRaw -Href $VMLink -Session $DLGen9SSOToken
$VMObject
$VMObject.Oem.Hp.BootOnNextServerReset
$VMObject.Image
Start-HPOVServer -InputObject $DLGen9Server

Теперь рассмотрим его более подробно. Сразу сделаю несколько замечаний:
  1. Я использовал сервер Proliant DL360 Gen9. Но подойдет любой Proliant DL или BL, начиная с 8-го поколения.
  2. Я использую старую объектную модель  REST API. Сейчас также в серверах Proliant реализована модель Redfish API, являющаяся индустриальным стандартом. Если использовать ее, то созданный скрипт будет работать и на серверах других производителей в части работы с процессором управления, если они поддерживают Redfish API. Подробнее о стандарте и тех, кто его поддерживает можно прочитать на сайте проекта http://redfish.dmtf.org/
  3. В моем примере команды вводятся в интерактивном режиме в командной строке PowerShell. При применении этого кода на практике его, конечно же, надо преобразовать в скрипт с такими входными параметрами, как IP-адрес HPE OneView, имя и пароль администратора, название шаблона профиля, который должен быть использован для подготовки сервера к работе
  4. Я не делал автоматическую установку ОС (unattended setup). Для полной автоматизации процесса, конечно, это стоит сделать
  5. Для корректной работы приводимых команд нужно поставить 2 библиотеки PowerShell: а. Командлеты для HPE OneView:
    на официальной странице Github https://github.com/HewlettPackard/POSH-HPOneView/
    или на сайте PowerShell Library https://www.powershellgallery.com/packages/HPOneView.310/3.10.1471.1581
    б. Командлеты для работы через REST c HPE iLO https://www.powershellgallery.com/packages/HPRESTCmdlets/1.2.0.0
  6. Объектная модель REST API для iLO описана на сайтах
    https://hewlettpackard.github.io/ilo-rest-api-docs/ilo4/ (не очень удобная база знаний)
    и
    https://ilorestfulapiexplorer.ext.hpe.com/
  7. нужен подготовленный сервер HTTP (в моем случае, это MS IIS), на котором выложены установочные образы ОС. Провьте заранее браузером, что образы доступны для просмотра и загрузки.
  8. Идея создания этой демонстрации и часть кода взята (монтаж Virtual Media) со страницы Github https://github.com/HewlettPackard/oneview-osdeployment
Перейдем теперь к разбору команд:

1. Соединяемся с OneView:
$HPOVSession = connect-HPOVMgmt -Hostname <OV IP> -UserName <username> -Password <password>

2. Выводим список доступных шаблонов профилей серверов:
Get-HPOVServerProfileTemplate

3. Выбираем приглянувшийся нам шаблон. В моем случае, это шаблон для серверного ресурса DL360 Gen9. Паттерн имени"*DL360 Gen9*". Шаблон с таким именем у меня один. Но для унификации выбираю первый из возможного списка:
$DLGen9Template = Get-HPOVServerProfileTemplate -Name  | select -First 1

4. После того, как мы выбрали шаблон, ищем свободный "-NoProfile" серверный ресурс, подходящий данному шаблону
$DLGen9Server = Get-HPOVServer -NoProfile -InputObject $DLGen9Template

5. Проверяем, что ресурс нашелся, выводя списко серверных ресурсов на экран. Если переводить данный листинг в скрипт, вместо вывода списка на экран нужно будет проверять, не равен ли объект/список $null. Теоретически, подходящих ресурсов может быть несколько. В этом случае можно применить фильтр " | select -First 1":
$DLGen9Server

6. На основе шаблона профиля и свободного серверного ресурса создаем серверный профиль с именем "CentOS DL Gen9 Server". В скрипте можно использовать конвейер и команду ожидания выполнения процесса " | Wait-HPOVTaskComplete". Появится симпатичный текстовый прогрессбар:
$DLGen9ServerProfile = New-HPOVServerProfile -Name "CentOS DL Gen9 Server" -AssignmentType "Server" -Server $DLGen9Server -Async -ServerProfileTemplate $DLGen9Template

7. Создаем токен безопасности для аутентификации на iLO сервера (SSO - Single Sign-on). По опыту, токен безопасности достаточно быстро протухает. Если вдруг обращения по REST к iLO вдруг выдает ошибку, перезапросите токен. Прямой вызов команды "Get-HPOVIloSso" у меня не сработал, поэтому использовал конвейер:
$DLGen9SSOToken = $DLGen9Server |Get-HPOVIloSso -IloRestSession

8. Отключаем проверку SSL-сертификата. Скорее всего, подписанного у вас нет. Без отключения сервер будет выдавать ошибку авторизации:
Disable-HPRESTCertificateAuthentication

9. Получаем головной объект "Managers" в iLO REST:
$ManagerObjectsSSO = Get-HPRESTDataRaw -Href "/rest/v1/Managers" -Session $DLGen9SSOToken

10. Проверяем, что объект получен:
$ManagerObjectsSSO

11. Теоретически у сервера может быть несколько процессоров управления и, соответсвенно, под "Managers" может скрываться несколько объектов. Ищем тот, у которого есть дочерний объект "VirtualMedia". Здесь и далее примеры с циклом сделаны для универсальности. Процедуру поиска и настройки объектов можно упростить, если использовать прямые ссылки на объекты. Но в этом случае теряется универсальность команд:
foreach ($ManagerObjectSSO in $ManagerObjectsSSO.links.Member.href) {$ManagerObjectData = Get-HPRESTDataRaw -Href $ManagerObjectSSO -Session $DLGen9SSOToken; if ($ManagerObjectData.links.PSObject.Properties.name -Contains 'VirtualMedia') {break}}

12. Проверяем, что объект получен:
$ManagerObjectData

13. Получаем ссылку на головной объект VirtualMedia. Этот объект имеет несколько дочерних объектов:
$VMData = Get-HPRESTDataRaw -Href $ManagerObjectData.links.VirtualMedia.href -Session $DLGen9SSOToken

14. Среди дочерних объектов VirtualMedia находим тот, что соответсвует типу носителя CD/DVD Virtual Media. Обычно дочерних объектов два: Floppy-привод (рудимент) и CD/DVD:
foreach ($VMLink in $VMData.links.Member.href) {$VMObject = Get-HPRESTDataRaw -Href $VMLink -Session $DLGen9SSOToken; if ($VMObject.MediaTypes -contains 'DVD'){break}}

15. Проверяем, что объект получен:
$VMObject

16. Необязательный шаг. Отмонтирует образ VirtualMedia, если какой-то уже смонтирован. Для этого вначале готовим переменну в виде массива с именованным индексом:
$mountSetting = @{'Image' = $null}

17. Записываем новое значение в iLO. В скрипте можно проверить, чему равно свойство "Image" и вызвать следующую команду только, если свойство не равно Null. В моем примере я поступаю подругому - я просто указываю игнорировать ошибку "-ErrorAction SilentlyContinue", которая возникает, если 'Image' уже Null:
$result = Set-HPRESTData -Href $VMLink -Setting $mountSetting -Session $DLGen9SSOToken -ErrorAction SilentlyContinue

18. Аналогично пункту 16 готовим переменную для внесения изменений в настройки VirtualMedia. Объектная модель есть по ссылкам выше (пункт 6 замечаний). Нужно изменить два параметра: путь к образу и выполнение единоразовой загрузки сервера с VirtualMedia. Итак, готовим переменные:
$mountSetting = @{'Image' = ‘ http://<HTTP Server IP>/isoboot/CentOS-6.7-x86_64-bin-DVD1.iso’}
$oem = @{'Hp' = @{'BootOnNextServerReset' =$true}}
$mountSetting.Add('Oem',$oem)

19. Проверяем:
$mountSetting 

20. Записываем изменения в iLO:
$result = Set-HPRESTData -Href $VMLink -Setting $mountSetting -Session $DLGen9SSOToken

21. Перезачитываем объект VirtualMedia для проверки, что изменения внесены. Тут стоит обратить внимание на следующее. Если присвоить новое значение какому-нибудь свойству объекта VirtualMedia, например, $VMObject.Image, то эти изменения не будут автоматически записаны в iLO. Для записи изменений надо использовать команду Set-HPRESTData с соответствующими параметрами, как мы сделали в пункте 20. А после того, как изменения были записаны в iLO, они не будут автоматически обновлены в объекте PowerShell. То есть объект надо перезачитать:
$VMObject = Get-HPRESTDataRaw -Href $VMLink -Session $DLGen9SSOToken

22. Проверяем, что изменения внесены в настройки iLO:
$VMObject
$VMObject.Oem.Hp.BootOnNextServerReset
$VMObject.Image


23. запускаем сервер с использованием командлета для HPE OneView:
Start-HPOVServer -InputObject $DLGen9Server

На этом всё. Если статья понравилась, жду ваших комментариев и замечаний. Если не понравилось, пишите, что не так :). Какие еще примеры работы с PowerShell, HPE OneView и REST API вам были бы интересны?

Short listing description in English:


Here is my demo command listing based on the page mentioned above and script “Mount-VirtualMedia.ps1”. I used DL360 Gen9 in my lab to demonstrate IP script boot:

1. Connecting to OV
$HPOVSession = connect-HPOVMgmt -Hostname <OV IP> -UserName <username> -Password <password>

2. Looking for Templates
Get-HPOVServerProfileTemplate

3. Choosing the right Template
$DLGen9Template = Get-HPOVServerProfileTemplate -Name "*DL360 Gen9*" | select -First 1

4. Selecting the free server resourse corresponding to our Template
$DLGen9Server = Get-HPOVServer -NoProfile -InputObject $DLGen9Template

5. Verifying that the server was selected correctly
$DLGen9Server

6. Creating server profile. You need to wait the end of profile creation
$DLGen9ServerProfile = New-HPOVServerProfile -Name "CentOS DL Gen9 Server" -AssignmentType "Server" -Server $DLGen9Server -Async -ServerProfileTemplate $DLGen9Template

7. Getting the iLO security token for our server
$DLGen9SSOToken = $DLGen9Server |Get-HPOVIloSso -IloRestSession

8. Disabling SSL certificate verification. The next steps will not work without this action
Disable-HPRESTCertificateAuthentication

9. Getting root Manager object from iLO REST
$ManagerObjectsSSO = Get-HPRESTDataRaw -Href "/rest/v1/Managers" -Session $DLGen9SSOToken

10. Verifiyng
$ManagerObjectsSSO

11. Looking for Manager spine
foreach ($ManagerObjectSSO in $ManagerObjectsSSO.links.Member.href) {$ManagerObjectData = Get-HPRESTDataRaw -Href $ManagerObjectSSO -Session $DLGen9SSOToken; if ($ManagerObjectData.links.PSObject.Properties.name -Contains 'VirtualMedia') {break}}

12. Verifiyng
$ManagerObjectData

13. Getting Virtual Media root object
$VMData = Get-HPRESTDataRaw -Href $ManagerObjectData.links.VirtualMedia.href -Session $DLGen9SSOToken

14. Looking for CD/DVD media Virtual Media. Usually there are two leafs: Floppy and CD/DVD
foreach ($VMLink in $VMData.links.Member.href) {$VMObject = Get-HPRESTDataRaw -Href $VMLink -Session $DLGen9SSOToken; if ($VMObject.MediaTypes -contains 'DVD'){break}}

15. Verifiyng
$VMObject

16. Unmount Image. Optional step
$mountSetting = @{'Image' = $null} 
$result = Set-HPRESTData -Href $VMLink -Setting $mountSetting -Session $DLGen9SSOToken -ErrorAction SilentlyContinue

17. Preparing variable to change the ISO path and One-Time Boot setting
$mountSetting = @{'Image' = ‘ http://<HTTP Server IP>/isoboot/CentOS-6.7-x86_64-bin-DVD1.iso’}
$oem = @{'Hp' = @{'BootOnNextServerReset' =$true}}
$mountSetting.Add('Oem',$oem)


18. Verifiyng
$mountSetting

19. Write changes to iLO
$result = Set-HPRESTData -Href $VMLink -Setting $mountSetting -Session $DLGen9SSOToken

20. Re-reading VM spine for verification
$VMObject = Get-HPRESTDataRaw -Href $VMLink -Session $DLGen9SSOToken

21. Verifiyng that boot setting were changed correctly
$VMObject
$VMObject.Oem.Hp.BootOnNextServerReset
$VMObject.Image


22. Starting server via OV
Start-HPOVServer -InputObject $DLGen9Server

“Verifiyng” steps are just for visualization during demo and debugging. Of course this commands can be written as a PS script. Cycles can be replaced with direct REST links.

Idea for this demo and some code (Virtual Media Mount) has been taked from this Github page
https://github.com/HewlettPackard/oneview-osdeployment


If you like the post, or if ou have any questions or suggestions please leave comment:) If you are interested in English subtitles, please give me to know.



Комментариев нет: