it-swarm-eu.dev

Automaticky spouštět příkazy přes SSH na mnoha serverech

V souboru TXT je seznam IP adres, např .:

1.1.1.1
2.2.2.2
3.3.3.3

Za každou IP adresou je server a na každém serveru je spuštěn sshd na portu 22. Ne každý server je v known_hosts list (na mém PC, Ubuntu 10.04 LTS/bash).

Jak mohu na těchto serverech spouštět příkazy a shromažďovat výstup?

Ideálně bych rád spouštěl příkazy paralelně na všech serverech.

Budu používat ověřování veřejným klíčem na všech serverech.

Zde jsou některé potenciální nástrahy:

  • Ssh mě vyzve, abych dal dané ssh klíče serverů na můj known_hosts soubor.
  • Dané příkazy mohou vrátit nenulový výstupní kód, což znamená, že výstup je potenciálně neplatný. Musím to uznat.
  • Připojení k danému serveru může selhat, například kvůli chybě sítě.
  • Měl by existovat časový limit pro případ, že příkaz běží déle, než se očekávalo, nebo když server při spuštění příkazu klesl.

Servery jsou AIX/ksh (ale myslím, že na tom opravdu nezáleží.

47
LanceBaynes

Za předpokladu, že nejste schopni nainstalovat pssh nebo jiné, můžete udělat něco podobného:

tmpdir=${TMPDIR:-/tmp}/pssh.$$
mkdir -p $tmpdir
count=0
while IFS= read -r userhost; do
    ssh -n -o BatchMode=yes ${userhost} 'uname -a' > ${tmpdir}/${userhost} 2>&1 &
    count=`expr $count + 1`
done < userhost.lst
while [ $count -gt 0 ]; do
    wait $pids
    count=`expr $count - 1`
done
echo "Output for hosts are in $tmpdir"
15
Arcege

Existuje několik nástrojů, které vám umožňují přihlásit se a provádět řadu příkazů na více počítačích současně. Zde je pár:

62
Caleb

Pokud provádíte Python skriptování více než bash skriptování, pak Fabric může být pro vás nástrojem.

Z domovská stránka Fabric :

Fabric je Python (2,5 nebo vyšší)) knihovna a nástroj příkazového řádku pro zjednodušení využití SSH pro nasazení aplikací nebo správu systémů.

Poskytuje základní sadu operací pro provádění místních nebo vzdálených příkazů Shell (normálně nebo prostřednictvím Sudo) a odesílání/stahování souborů, jakož i pomocné funkce, jako je výzva běžícímu uživateli ke vstupu nebo zrušení provádění.

Typické použití zahrnuje vytvoření modulu Python) obsahujícího jednu nebo více funkcí a jejich provedení pomocí nástroje příkazového řádku fab.

18
Riccardo Murri

K tomu používám GNU paralelní , konkrétně můžete použít toto recept:

parallel --tag --nonall --slf your.txt command

S your.txt je soubor s IP adresou/jmény serveru.

11
Anthon

Velmi základní nastavení:

for Host in $(cat hosts.txt); do ssh "$Host" "$command" >"output.$Host"; done

Ověřování pomocí jména/hesla není opravdu dobrý nápad. Za tímto účelem byste si měli nastavit soukromý klíč:

ssh-keygen && for Host in $(cat hosts.txt); do ssh-copy-id $Host; done
8
michas

Navrhuji Ansible.cc . Je to správce konfigurace a dispečer příkazů.

4
Tom

Projekt Hypertable nedávno přidal nástroj ssh pro více hostitelů. Tento nástroj je vytvořen s libssh a navazuje spojení a vydává příkazy asynchronně a paralelně pro maximální paralelitu. Kompletní dokumentaci viz Multi-Host SSH Tool . Chcete-li spustit příkaz na sadě hostitelů, spusťte jej následujícím způsobem:

$ ht ssh 1.1.1.1,2.2.2.2,3.3.3.3 uptime

Můžete také určit název hostitele nebo vzor IP, například:

$ ht ssh 1.1.1.[1-99] uptime
$ ht ssh Host[00-99] uptime

Podporuje také --random-start-delay <millis> volba, která odloží start příkazu na každém hostiteli náhodným časovým intervalem mezi 0 a <millis> milisekund. Tuto možnost lze použít, aby se zabránilo hromovým problémům se stádem, když spuštěný příkaz přistupuje k centrálnímu prostředku.

2
Doug judd

Myslím, že hledáte pssh a související paralelní verze obvyklých scp, rsync atd. ..

2
unclejamil

Postavil jsem open-source nástroj s názvem Overcast , abych takovou věc usnadnil.

Nejprve definujete své servery:

overcast import vm.01 --ip 1.1.1.1 --ssh-key /path/to/key
overcast import vm.02 --ip 2.2.2.2 --ssh-key /path/to/key

Pak můžete přes ně spouštět více příkazů a skriptových souborů, a to buď postupně, nebo paralelně:

overcast run vm.* uptime "free -m" /path/to/script --parallel
2
Andrew Childs

Vyvinul jsem collectnode Velmi jednoduché a efektivní, aby se úkoly prováděly na několika serverech (včetně oken)

Jak používat CollectNode:

  1. Vytvořte seznam serverů, se kterými budete pracovat:

    # cat hosts.file
    server1
    server2
    server3
    server4
    server5
    
  2. Spustit CollectNode předáním seznamu obsluhujících:

    collectnode --file servers.txt --command='cat /etc/httpd/conf/httpd.conf |grep ^User'
    
  3. Opticky je možné výsledky filtrovat, například tento příkaz zobrazí pouze server, na kterém je podmínka splněna.

    collectnode --file servers.txt --command='cat /etc/httpd/conf/httpd.conf |grep ^User' --where="command contain User"
    

https://collectnode.com/5-tasks-collectnode-can-help-managing-servers/

2
fvidalmolina

Jen headsup pro opravdu pěknou otázku:

Nejlepší řešení, které jsem našel, není překvapivě tmux.

Můžete udělat Ctrl-B: setw synchronize-tabla v tmux pro úžasný výsledek. Musíte mít všechna vaše ssh připojení otevřená, v různých tabulkách 1 okna Tmuxu.

1
Mikhail Krutov

Myslím, že "očekávat" je to, co potřebujete.
Mnoho lidí ani neví, že existuje. Je to program založený na tcl, který vám klade dotazy a možné odpovědi vaším jménem. Podívejte se na https://wiki.tcl-lang.org/page/Expect

0
Clement

Vytvořte soubor/etc/sxx/hosts

naplnit takto:

[grp_ips]
1.1.1.1
2.2.2.2
3.3.3.3

sdílet ssh klíč na všech strojích.

Nainstalujte sxx z balíčku:

https://github.com/ericcurtin/sxx/releases

Poté spusťte příkaz takto:

sxx [email protected]_ips "whatever bash command"
0
ericcurtin

Možná něco takového funguje, spouštět příkaz na více hostitelích? Předpokládejme, že všichni hostitelé jsou nastaveni v .ssh/config pro přihlášení bez hesla.

$ < hosts.txt xargs -I {} ssh {} command

0
Y0NG

Použijte parametriko http://www.paramiko.org/ a paralelismus založený na vláknech https://docs.python.org/3/library/threading.html .below kód umožňuje provádět více příkazů na každém serveru paralelně!

ssh = paramiko.SSHClient()
ssh.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
ssh.load_system_Host_keys()
ssh.connect(hostname, port, username, password)
t = threading.Thread(target=tasks[index], args=(ssh, box_ip,))
t.start()

Poznámka: opakujte výše uvedené pokyny pro každý server.

0
Sharma