W pliku .txt znajduje się lista adresów IP, np .:
1.1.1.1
2.2.2.2
3.3.3.3
Za każdym adresem IP znajduje się serwer, a na każdym serwerze znajduje się sshd działający na porcie 22. Nie każdy serwer znajduje się na known_hosts
liście (na moim komputerze, Ubuntu 10.04 LTS / bash).
Jak uruchomić polecenia na tych serwerach i zebrać dane wyjściowe?
Idealnie byłoby, gdyby polecenia były uruchamiane równolegle na wszystkich serwerach.
Będę używać uwierzytelniania za pomocą klucza publicznego na wszystkich serwerach.
Oto niektóre potencjalne pułapki:
- Ssh monituje mnie o umieszczenie podanego klucza ssh serwera w moim
known_hosts
pliku. - Podane polecenia mogą zwrócić niezerowy kod wyjścia, wskazując, że dane wyjściowe są potencjalnie nieprawidłowe. Muszę to rozpoznać.
- Nie można nawiązać połączenia z danym serwerem, na przykład z powodu błędu sieci.
- Powinien istnieć limit czasu na wypadek, gdyby polecenie działało dłużej niż oczekiwano lub serwer przestał działać podczas uruchamiania polecenia.
Serwery to AIX / ksh (ale myślę, że to naprawdę nie ma znaczenia.
ssh
scripting
parallelism
LanceBaynes
źródło
źródło
Odpowiedzi:
Zakładając, że nie możesz zainstalować pssh lub innych, możesz zrobić coś podobnego do:
źródło
-o StrictHostKeyChecking=no
aby tego uniknąć. Lepiej jednak najpierw przeskanować wszystkie serwery z wiersza polecenia, aby dodać klucze hosta.wait
Komenda odzyskuje te zasoby, w tym kodzie proces return (jak processs wyszły). Następnie, jeśli później w programie umieścisz inny proces, powiedzmy kompresję, w tle i trzeba na nią poczekać, to bez tej pętli oczekiwanie odzyska jeden z ukończonych programów ssh, a nie kompresję - co może nadal biegać. Otrzymasz status zwrotu niewłaściwego procesu potomnego. Dobrze jest posprzątać po sobie.Istnieje kilka narzędzi, które umożliwiają logowanie się i wykonywanie serii poleceń na wielu komputerach jednocześnie. Oto kilka:
źródło
Jeśli lubisz pisać w skryptach w Pythonie bardziej niż
bash
skrypty, to Fabric może być dla Ciebie narzędziem.Ze strony głównej Fabric :
źródło
Używam do tego GNU równoległego , szczególnie możesz użyć tego przepisu:
Z
your.txt
bycia plik z serwera adres IP / nazwami.źródło
ssh
istniałem, ale potrzebujesz sposobu, aby zalogować się na inne komputery, a te sposoby były mniej bezpieczne (jakrsh
). Nie opisujesz tego, czego używasz teraz, aby przejść z maszyny na maszynę (telnet
?,rsh
?).Bardzo podstawowa konfiguracja:
Uwierzytelnianie za pomocą nazwy / hasła nie jest naprawdę dobrym pomysłem. W tym celu należy skonfigurować klucz prywatny:
źródło
ssh $host $command
dla każdego hosta. Spróbuj uruchomić te polecenia ręcznie, aby dowiedzieć się, co się dzieje.Sugeruję Ansible.cc . To menedżer konfiguracji i dyspozytor poleceń.
źródło
Myślę, że szukasz pssh i powiązanych równoległych wersji zwykłego scp, rsync itp.
źródło
Zbudowałem narzędzie typu open source o nazwie Overcast, aby ułatwić tego typu rzeczy.
Najpierw zdefiniuj swoje serwery:
Następnie możesz uruchamiać na nich wiele poleceń i plików skryptów, sekwencyjnie lub równolegle, na przykład:
źródło
W projekcie Hypertable niedawno dodano narzędzie ssh dla wielu hostów. To narzędzie jest zbudowane przy pomocy libssh i ustanawia połączenia oraz wydaje polecenia asynchronicznie i równolegle dla uzyskania maksymalnej równoległości. Aby uzyskać pełną dokumentację, zobacz Narzędzie SSH dla wielu hostów . Aby uruchomić polecenie na zestawie hostów, uruchom je w następujący sposób:
Możesz także podać nazwę hosta lub wzorzec IP, na przykład:
Obsługuje również
--random-start-delay <millis>
opcję, która opóźnia uruchomienie polecenia na każdym hoście o losowy przedział czasu od 0 do<millis>
milisekund. Tej opcji można użyć, aby uniknąć problemów ze stadem grzmotów, gdy uruchamiane polecenie uzyskuje dostęp do zasobu centralnego.źródło
Opracowałem Collectnode Bardzo prosty i skuteczny do wykonywania zadań na kilku serwerach (w tym Windows)
Jak korzystać z CollectNode:
Utwórz listę serwerów, aby pracować z:
Wykonaj CollectNode, przekazując listę serwów:
Opcjonalnie możliwe jest filtrowanie wyników, na przykład to polecenie wyświetla tylko serwer, na którym warunek jest spełniony.
https://collectnode.com/5-tasks-collectnode-can-help-managing-servers/
źródło
Tylko heads-up na naprawdę miłe pytanie:
Najlepsze rozwiązanie, jakie znalazłem, to nie tak zaskakujące tmux.
Możesz zrobić Ctrl-B: setw panele synchronizacji w tmux dla niesamowitego resut. W tym celu musisz mieć otwarte wszystkie połączenia ssh, w różnych oknach 1 okna Tmux.
źródło
Może coś takiego działa, aby uruchomić polecenie na wielu hostach? załóżmy, że wszystkie hosty są skonfigurowane w .ssh / config do logowania bez hasła.
$ < hosts.txt xargs -I {} ssh {} command
źródło
Utwórz plik / etc / sxx / hosts
wypełnić się tak:
udostępnij klucz ssh na wszystkich komputerach.
Zainstaluj sxx z pakietu:
https://github.com/ericcurtin/sxx/releases
Następnie uruchom polecenie tak:
źródło
Użyj Paramiko http://www.paramiko.org/ i równoległości opartej na wątku https://docs.python.org/3/library/threading.html. Poniżej kod pozwala na wykonywanie wielu poleceń na każdym serwerze równolegle!
Uwaga: powtórz powyższe instrukcje dla każdego serwera.
źródło
Myślę, że „oczekuj” jest tym, czego potrzebujesz.
Wiele osób nawet nie wie, że istnieje. Jest to program oparty na tcl, który zadaje pytania i możliwe odpowiedzi w Twoim imieniu. Zajrzyj na https://wiki.tcl-lang.org/page/Expect
źródło