To już ostatnia część artykułu, tu początek
Ostatni raz pisałem o tym jak wdrożyłem monitorowanie urządzeń, teraz porozmawiamy o zarządzaniu. W rozmowach z „technikami” po stronie Klienta często spotykam się z ograniczonym postrzeganiem możliwości tak małych urządzeń (przy małych zasobach pamięci i wydajności), wielu uważa, że „najbardziej potrzebujemy wysłać restart, aby uzyskać coś więcej poważnie, wyślemy zespół”.
Praktyka pokazuje jednak, że nie jest to do końca prawdą.
- Diagnostyka sieci i rozwiązywanie problemów. Za portem Ethernet routera zwykle znajduje się inny element sprzętu, który ma swój własny wewnętrzny adres IP. Czasami możesz (powinieneś) go „pingować”. Albo zarządzanie tunelem - jeśli nagle tunel nie podnosi się na routerze pracującym przez modem 3G, ale widzimy sam router.
- Konserwacja systemu. Aktualizacja oprogramowania sprzętowego, aktualizacja skryptu serwisowego.
- Akt równoważący. Można to nazwać „perwersją”, ale koncepcja „równoważnika”, jak cytuję, „zdolność cyrkowca do utrzymania równowagi w niestabilnej pozycji ciała” - lepiej pasuje. Takie sytuacje wynikają z ograniczonego budżetu Klienta. Poniżej podałem kilka przykładów, ale... Nie są one bezpośrednio związane z tematem opowiadania, zamieszczam je w notatkach
Monitorowanie Wi-FiModny temat od pięciu lat, głównie wśród federalnych sieci handlowych. Spacerujesz spokojnie po parkietach, a Twój telefon komórkowy z włączonym Wi-Fi, próbując „przykleić się” do jakiegoś wątku sieci, regularnie wysyła pakiety Probe Request, które można przeanalizować w celu obliczenia ty: jak często przychodzisz do tego sklepu, z jakiego powodu, chodzisz po trajektoriach i tak dalej. Następnie dane są zbierane, analizowane, rysowane są mapy cieplne, a menedżerowie „wyłudzają” pieniądze od zarządu lub inwestorów za takie zdjęcia. No cóż, na razie.... „nie ma pieniędzy, ale trzymaj się…”, a wynik (prawdziwy) już trzeba pokazać, zaczyna się stara dobra piosenka: „Tak, tak, w takim razie oczywiście zainstaluję cis i wszystko, co chcesz, ale teraz musimy pokazać klientowi wynik! Swoją drogą zapomnieliśmy dodać, że Klient pozwolił nam podłączyć nasz sprzęt do swojego hotspotu poprzez Wi-Fi, ale na zasadach ogólnych, tak jakbyśmy byli gośćmi.” I tak musimy zrobić równoważące routery - zostaje podniesionych kilka podinterfejsów Wi-Fi, z których jeden przylega do hotspotu, a drugi monitoruje środowisko, gorączkowo przesyła do siebie wynik tcpdump, po czym pakuje zawartość pliku do archiwum i ryzykuje umierający z „przejedzenia” próbuje wypluć zawartość na serwer FTP. Nic dziwnego, że router równoważący często „psuje się” i trzeba go jakoś zdalnie „reanimować”.
PromieńŁatwiej opisać tutaj sytuację za pomocą czegoś takiego jak oświadczenie klienta: „Chcemy zdecentralizowanej sieci hotspotów, która działałaby na sprzęcie, którego model nie jest z góry znany, kanałami, ale którego jeszcze nie znamy. Aha, zapomnieliśmy powiedzieć, że chcemy nie tylko wyświetlać klientom reklamy, ale także analizować wszystko wokół lokalizacji, w której zainstalowany jest hotspot. Nie, jeszcze nie wiemy dlaczego, ale się dowiemy, nie wątpcie, udało nam się wpaść na ten pomysł.
A nie zapominajmy, że ze względu na wiele nieznanych wcześniej okoliczności, sterowanie musi odbywać się w niestandardowych warunkach, kiedy nie możemy połączyć się z routerem bezpośrednio przez port IP: i zmuszeni jesteśmy po prostu czekać na aktywność z niego. Jeśli się abstrahujemy, dialog między serwerem a routerem można przedstawić w następujący sposób:
- Routera: Cześć. Jestem takim a takim routerem, czy są dla mnie jakieś zadania?
- Server: router taki i taki, zarejestrowałem cię, że żyjesz. Oto wyzwanie: pokazać wynik polecenia ifconfig?
- Routera: Cześć. Jestem takim a takim routerem, ostatnim razem, gdy prosiłeś o pokazanie wyniku ifconfig, oto on. Czy są dla mnie jakieś zadania?
- Server: router taki i taki, zarejestrowałem cię, że żyjesz. Nie ma dla Ciebie żadnych zadań.
Najciekawsze pytanie: w jaki sposób zdalny router może wysłać określoną ilość informacji? W ostatniej części opisałem, że router ze względu na ograniczone zasoby posiada jedynie „okrojony” wget, który działa tylko poprzez GET i nic więcej; nie ma tam klienta FTP ani curl. Dokładniej, potrzebujemy uniwersalnej metody, niezależnie od cech montażu obrazu. Zdecydowałem się użyć wget. A dokładniej, jak się „zatrzymałam” – po prostu nie miałam wyboru :)
Tylko zastrzeżenieMoje rozwiązanie do zarządzania działa, choć nie jest bardzo ograniczone, i jestem pewien, że jest krzywe, nawet jeśli odpowiada większości moich klientów. Jak mógłbyś to zrobić mądrze - napisz małe narzędzie, które będzie wysyłać dane binarne POST przez port 80. Dołącz je (narzędzie) do oprogramowania sprzętowego routera i uzyskaj do niego dostęp za pomocą bash. Ale rzeczywistość jest taka, że: a) musimy szybko b) prawdopodobnie będziemy musieli zrobić wszystko na istniejącym „zoo routerów” c) „nie szkodzić!” — jeśli router pracuje i wykonuje inne zadania, spróbuj wprowadzić zmiany, które nie będą miały wpływu na istniejącą funkcjonalność.
Przejdźmy do realizacji. Załóżmy, że Twój klient chce łatwo i naturalnie zrestartować router z Zabbix za pomocą „kliknięcia myszą”. Dziś zaczniemy opisywać wdrożenie w Zabbixie.
W menu „Administracja” -> „Skrypty” dodaj nowy skrypt. Nazywamy to „Reboot”, wpisz „php /usr/share/zabbix/reboot.php {HOST.HOST}” jako polecenie
Dalej: Menu „Monitorowanie” -> „Najnowsze dane” -> „Kliknij prawym przyciskiem myszy żądany węzeł sieci”. Tak będzie wyglądać menu po dodaniu skryptu.
W związku z tym umieściliśmy skrypt restart.php w katalogu /usr/share/zabbix (Twój może być inny, ja używam katalogu głównego Zabbixa).
Zastrzeżenie dotyczące bezpieczeństwaAby wyjaśnienie w skrypcie było jaśniejsze, używam tylko identyfikatora routera, ale nie używam hasła. Nie zaleca się robienia tego w wersji produkcyjnej! Dlaczego to zrobiłem: ponieważ najważniejsze pytanie brzmi: gdzie przechowywać hasła do routerów? W samym zabbixe w „danych inwentarza”? Kontrowersyjna praktyka. Alternatywnie: ogranicz dostęp zewnętrzny do samego pliku restart.php
Plik restart.php
<?php
// присваиваем параметры с консоли переменным
$user = $argv[1];
// ВНИМАНИЕ. Вот здесь в целях безопасности все-таки прописывать пароль устройства! Но для демонстрации мы будем обращаться к базе данных без использования пароля.
//$password = $argv[2];
$conn=new mysqli("localhost","db_user","db_password","db_name");
if (mysqli_connect_errno()) {
exit();
}
$conn->set_charset("utf8");
// "Отправляем" команду reboot за счет изменения поля task таблицы users. В поле task можно отправлять любую команду.
$sql_users=$conn->prepare("UPDATE users SET task='reboot' WHERE id=? AND status='active';");
$sql_users->bind_param('s', $user);
$sql_users->execute();
$sql_users->close();
?>
To wszystko. Pytanie pozostaje otwarte: „jak uzyskać wynik wykonania polecenia z urządzenia”. Przyjrzyjmy się zadaniu na przykładzie polecenia ifconfig. Polecenie to można wysłać do urządzenia:
message=`ifconfig`; wget "http://xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php?u=user&p=password!&m=$message" -O /tmp/out.txt
, gdzie:
wiadomość=`ifconfig` — przypisujemy wynik polecenia ifconfig do zmiennej $message
wget”
u=użytkownik&p=hasło!&m=$wiadomość — dane uwierzytelniające i wartość zmiennej żądania m — przypisuje zawartość zmiennej $message
-O /tmp/out.txt — w tym przypadku nie potrzebujemy wyjścia do pliku /tmp/out.txt, ale jeśli ten parametr nie zostanie podany, wget nie zadziała
Dlaczego to nie działa?Ponieważ jest to potencjalna luka w zabezpieczeniach. Najbardziej nieszkodliwy błąd, jaki może się zdarzyć, to znak „&” na wyjściu polecenia. Dlatego konieczne jest filtrowanie zarówno wszystkiego, co jest wysyłane z routerów, jak i wszystkiego, co przychodzi do serwera. Tak, jest mi wstyd, naprawdę. Na swoją obronę mogę tylko napisać, że cały artykuł poświęcony jest sposobowi zarządzania routerami z predefiniowanym oprogramowaniem i kanałami komunikacyjnymi, które nie są z góry zdefiniowane.
Cóż, początek na przyszłość: nie wymyśliłem jeszcze, jak używać standardowych narzędzi Zabbix do odzwierciedlania wyników (na przykład wyniku wykonania polecenia), które przychodzą do serwera.
Przypominam, że wszystkie źródła można pozyskać z repozytorium Git pod adresem:
Źródło: www.habr.com