W mojej pracy często zmagam się z obsesjami na punkcie braku informacji o infrastrukturze, a przy zwiększającym się parku serwerów staje się to prawdziwą męką. Nawet gdy administrowałem w małych organizacjach, zawsze chciałem wiedzieć, co gdzie stoi, gdzie jest podłączone, kto z ludzi odpowiada za jaką część sprzętu lub usługę, i co najważniejsze — rejestrować zmiany w tym wszystkim. Kiedy przyjeżdżasz w nowe miejsce i stajesz w obliczu jakiegoś incydentu, mnóstwo czasu spędza się na szukaniu tych informacji. Poniżej opowiem, z czym musiałem się zmierzyć w RuVDS oraz jak rozwiązałem problem określony w tytule.
Tło
Jako administrator w przedsiębiorstwie, miałem niewielkie doświadczenie w pracy w data center, ale kątem oka zauważyłem RackTables. Przedstawiała ona w przejrzysty sposób szafę z wszystkimi serwerami, UPS-ami, switchami i wszystkimi połączeniami między nimi. W RuVDS nie było podobnego systemu, a tylko pliki Excel/papierowe z informacjami o serwerach, ich niektórych komponentach, numerach szaf i tym podobne. Przy takim podejściu bardzo trudno śledzić zmiany i małe komponenty. Najważniejszym i najczęściej wymienianym materiałem eksploatacyjnym w serwerach są dyski. Bardzo ważne jest, aby mieć aktualne informacje o stanie dysków i ich strategicznych zapasach. Jeśli dysk wypadnie z macierzy RAID i nie będzie jego szybkiej wymiany, może to doprowadzić do fatalnych skutków. Dlatego potrzebujemy systemu, który śledziłby lokalizację dysków i ich stan, aby zrozumieć, czego może nam brakować i jakie modele trzeba kupić.
Na pomoc przyszedł GLPI, produkt o otwartym kodzie źródłowym, stworzony w celu poprawy pracy działów IT i doprowadzenia ich do ideals ITIL. Oprócz inwentaryzacji sprzętu i zarządzania szafami, zawiera bazę wiedzy, helpdesk, zarządzanie dokumentami i wiele więcej. GLPI ma wiele wtyczek, w tym FusionInventory i OCS Inventory, które pozwalają automatycznie zbierać informacje o komputerach i innych urządzeniach poprzez instalację agentów i SNMP. Szczegółowe informacje na temat instalacji GLPI i wtyczek możesz znaleźć w innych artykułach, najlepiej — . Możemy go zainstalować na naszym hostingu na gotowym szablonie .
Jednak po wdrożeniu agenta otworzymy komponenty komputera w GLPI i zobaczymy to:

Problematyk jest taki, że żaden z wtyczek nie może zobaczyć informacji o fizycznych dyskach w macierzach RAID LSI. Zobaczywszy, jak ten problem został rozwiązany do monitorowania w Zabbixie za pomocą skryptu PowerShell, postanowiłem napisać analogiczny, aby przesłać informacje do GLPI.
Dane o dyskach w macierzy można uzyskać za pomocą narzędzi od producenta kontrolera, w przypadku LSI jest to StorCLI. Z niej można uzyskać dane w formacie JSON, przeanalizować je i przesłać do API GLPI. Dyski będziemy przypisywać do komputerów, które już zostały utworzone przez FusionInventory. Przy ponownym wykonaniu skryptu zaktualizuje on dane dotyczące dysków i doda nowe. Sam skrypt Send-RAIDtoGLPI.ps1 znajduje się . Następnie opiszę, jak z niego skorzystać.
Co będzie potrzebne
- w wersji 9.5.1 (na tej testowano)
- Wtyczka i agent na Windows
- Windows 2012 R2 (lub wyższy) jako system gospodarza, albo VM zarządzająca z przekazanym do niej kontrolerem, PowerShell w wersji 4 lub wyższej
- Zainstalowany sterownik MegaRAID
- Moduł dla PowerShell —
- Konto w GLPI z profilem Admin do autoryzacji przez API, wygenerowane UserToken i AppToken
Ważny punkt. W GLPI są jakoś dwie różne encje dla modelu dysku, ale brakuje właściwości „typ nośnika”. Dlatego do zapisania właściwości HDD i SSD postanowiłem użyć rozwijanego menu „Modele dysków twardych” (front/devicemodel.php?itemtype=DeviceHardDriveModel). Dla skryptu konieczne jest posiadanie tych wartości w bazie GLPI, inaczej nie będzie mógł zapisać danych o modelu dysku. Dlatego należy dodać najpierw HDD, a potem SSD, aby ID tych elementów w bazie wyniosły 1 i 2. Jeśli będą inne, to zamień w tej linijce skryptu Send-RAIDtoGLPI.ps1 po HDD i SSD odpowiednie im ID zamiast 1 i 2:
deviceharddrivemodels_id = switch ($MediaType) { "HDD" { "1" }; "SSD" { "2" }; default { "" } }Jeśli nie chcesz się tym przejmować lub używasz tego rozwijanego menu w inny sposób, możesz po prostu usunąć tę linijkę ze skryptu.
Należy również dodać statusy dla dysków w „Statusach elementów” (front/state.php). Dodałem statusy „MediaError” (gdy wystąpił chociaż jeden błąd dostępu do dysku) i „OK”, linia w skrypcie, gdzie przekazywane są ich ID, „2” dla „OK” i „1” dla „MediaError”:
states_id = switch ($MediaError) { 0 { "2" }; { $_ -gt 0 } { "1" } }Te statusy są potrzebne dla wygody, jeśli nie potrzebujesz tych właściwości, możesz również całkowicie usunąć tę linijkę.
W samym skrypcie nie zapomnij podać zmiennych na swoje. $GlpiCreds powinien zawierać URL do serwera API GLPI, UserToken i AppToken.
Co w skrypcie
Z powodu ciężkiego parsowania JSON oraz wielu instrukcji if skrypt jest trudny do odczytania, dlatego opiszę jego logikę tutaj.
Podczas pierwszego uruchomienia na hoście skrypt przeszukuje wszystkich kontrolerów i szuka dysków w bazie GLPI według numerów seryjnych, a jeśli ich nie znajdzie, szuka modelu. Jeśli też nie znajdzie modelu, dodaje model nowego dysku do GLPI i zapisuje ten dysk w bazie.
Przy każdej nowej próbie skrypt będzie starał się wykryć nowe dyski, ale nie potrafi usuwać brakujących, więc będziesz musiał zrobić to ręcznie.
Przykład wdrożenia
W repozytorium skryptu znajduje się skrypt Deploy-Send-RAIDtoGLPI.ps1, który pobierze archiwum ZIP z niezbędnymi plikami z naszego serwera GLPI i wdroży je na każdym hoście.
Po skopiowaniu plików skrypt zainstaluje agenta FusionInventory, uruchamiając go jako codzienną zadanie, i stworzy podobne zadanie dla naszego skryptu. Po pomyślnym wdrożeniu w końcu będziemy mogli zobaczyć dyski w zakładce „Komponenty” komputera w GLPI.
Wynik
Teraz, wchodząc do GLPI w menu „Ustawienia” -> „Komponenty” -> „Dyski twarde”, możemy klikać modele dysków i sprawdzać ich ilość, aby zrozumieć, co musimy zakupić.

Źródło: habr.com
