Моя цель - создать сценарий PowerShell, который отслеживает состояние оборудования хоста и выдает предупреждения (с помощью кодов выхода), если состояние компонента не «ЗЕЛЕНЫЙ». Следующая информация извлекается из программного API как хеш-таблица по умолчанию.
Для удобства чтения это информация в формате JSON, которую я преобразовал с помощью командлета convertto-json :
"host": {
"serial_number": "55555",
"status": "GREEN",
"name": "hostname",
"raid_card": {
"serial_number": "55555",
"status": "GREEN",
"product_name": "PRODUCT",
},
"battery": {
"percent_charged": 100,
"health": "HEALTHY",
"status": "GREEN"
},
"accelerator": {
"temperature": 36,
"status": "GREEN"
},
"logical_drives": [
"@{serial_number=55555555555; health=HEALTHY}",
"@{serial_number=55555555556; health=HEALTHY}"
]
}
}
Если какой-либо из компонентов (батарея, raid_card, accelerator или logic_drives) не зеленый, то значение верхнего хоста.status изменится на «КРАСНЫЙ».
Логика, которую я предполагаю, состоит в том, чтобы сделать начальную инструкцию if, в которой если host.value имеет значение «ЗЕЛЕНЫЙ», затем завершить 0 (что означает, что он работает) и просто вывести сообщение.
В противном случае выполните цикл foreach для поиска и определения того, какой компонент не «ЗЕЛЕНЫЙ». Вот где я застрял с логикой.
Первая проблема, с которой я столкнулся, это не знание, подходит ли цикл foreach для этой проблемы. Если это так, как вы можете структурировать цикл foreach, так как один из компонентов, логические диски, имеет вложенную хеш-таблицу внутри.
Вторая проблема, с которой я столкнулся, - как вы можете получить имя компонента, если статус не «ЗЕЛЕНЫЙ»?
Я не продвинулся далеко, но это структура, с которой я изначально собирался:
if (host.value -eq "GREEN"){
Write-Host "Message: host hardware is healthy"
Exit 0;
}
else{
foreach ($components in $response.host){
if ($_.status -ne "GREEN){
Write-Host "Message: host.??? is not healthy"
Exit 1;
}
}
Одной из альтернативных структур является выполнение операторов if / elseif вместо цикла foreach. Проблема в том, что он не очень элегантный, и его повторяемость предполагает, что есть лучший способ.
if (host.value -eq "GREEN"){
Write-Host "Message: host hardware is healthy"
Exit 0;
}
else{
if (host.raid_card.status -ne "GREEN"){
Write-Host "Message: host.raid_card.product_name is not healthy"
Exit 1;
}
elseif (host.battery.status -ne "GREEN"){
Write-Host "Message: host battery is host.battery.status"
Exit 1;
}
elseif (host.accelerator.status -ne "GREEN"{
Write-Host "Message: accelerator temperature is host.accelerator.temperature"
Exit 1;
}
}
Буду признателен за любые рекомендации по улучшению структуры!