it-swarm-id.com

Secara otomatis menjalankan perintah melalui SSH di banyak server

Ada daftar alamat IP dalam file .txt, mis .:

1.1.1.1
2.2.2.2
3.3.3.3

Di belakang setiap alamat IP ada server, dan di setiap server ada sshd yang berjalan di port 22. Tidak setiap server ada di known_hosts daftar (di PC saya, Ubuntu 10,04 LTS/bash).

Bagaimana saya bisa menjalankan perintah di server ini, dan mengumpulkan output?

Idealnya, saya ingin menjalankan perintah secara paralel di semua server.

Saya akan menggunakan otentikasi kunci publik di semua server.

Berikut adalah beberapa jebakan potensial:

  • Ssh meminta saya untuk meletakkan kunci ssh server yang diberikan ke known_hosts file.
  • Perintah yang diberikan mungkin mengembalikan kode keluar bukan nol, yang menunjukkan bahwa output berpotensi tidak valid. Saya perlu mengenali itu.
  • Sambungan mungkin gagal dibuat ke server yang diberikan, misalnya karena kesalahan jaringan.
  • Harus ada batas waktu, jika perintah berjalan lebih lama dari yang diharapkan atau server turun saat menjalankan perintah.

Servernya AIX/ksh (tapi saya pikir itu tidak terlalu masalah.

47
LanceBaynes

Dengan asumsi bahwa Anda tidak dapat menginstal pssh atau orang lain, Anda dapat melakukan sesuatu yang mirip dengan:

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

Ada beberapa alat di luar sana yang memungkinkan Anda untuk masuk dan menjalankan serangkaian perintah pada banyak mesin secara bersamaan. Berikut adalah pasangannya:

62
Caleb

Jika Anda menyukai Python scripting lebih dari bash scripting, maka Fabric mungkin menjadi alat untuk Anda.

Dari laman beranda Fabric :

Fabric adalah alat perpustakaan dan baris perintah Python (2.5 atau lebih tinggi) untuk merampingkan penggunaan SSH untuk penerapan aplikasi atau tugas administrasi sistem.

Ini memberikan rangkaian dasar operasi untuk menjalankan perintah Shell lokal atau jarak jauh (biasanya atau melalui Sudo) dan mengunggah/mengunduh file, serta fungsi tambahan seperti mendorong pengguna yang sedang berjalan untuk input, atau membatalkan eksekusi.

Penggunaan umum melibatkan pembuatan modul Python berisi satu atau lebih fungsi, kemudian menjalankannya melalui alat baris perintah fab.

18
Riccardo Murri

Saya menggunakan GNU parallel untuk itu, paling khusus Anda dapat menggunakan ini resep:

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

Dengan your.txt menjadi file dengan alamat/nama server IP.

11
Anthon

Setup yang sangat dasar:

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

Mengautentikasi dengan nama/kata sandi sebenarnya bukan ide yang bagus. Anda harus mengatur kunci pribadi untuk ini:

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

Saya sarankan Ansible.cc . Ini adalah manajer konfigurasi dan dispatcher perintah.

4
Tom

Proyek Hypertable baru-baru ini menambahkan alat ssh multi-Host. Alat ini dibangun dengan libssh dan membuat koneksi dan mengeluarkan perintah secara tidak sinkron dan secara paralel untuk paralelisme maksimum. Lihat Alat SSH Multi-Host untuk dokumentasi lengkap. Untuk menjalankan perintah pada set host, Anda akan menjalankannya sebagai berikut:

$ ht ssh 1.1.1.1,2.2.2.2,3.3.3.3 uptime

Anda juga dapat menentukan nama Host atau pola IP, misalnya:

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

Ini juga mendukung --random-start-delay <millis> opsi yang akan menunda dimulainya perintah pada setiap Host dengan interval waktu acak antara 0 dan <millis> milidetik. Opsi ini dapat digunakan untuk menghindari masalah kawanan petir ketika perintah yang dijalankan mengakses sumber daya pusat.

2
Doug judd

Saya pikir Anda sedang mencari pssh dan versi paralel terkait dari scp, rsync, dll.

2
unclejamil

Saya membuat alat open-source bernama Overcast untuk mempermudah hal ini.

Pertama, Anda menentukan server Anda:

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

Kemudian Anda dapat menjalankan beberapa perintah dan file skrip di atasnya, baik secara berurutan atau paralel, seperti:

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

Saya telah mengembangkan collectnode Sangat sederhana dan efektif untuk menyelesaikan tugas di beberapa server (termasuk windows)

Cara menggunakan CollectNode:

  1. Buat daftar server, untuk bekerja dengan:

    # cat hosts.file
    server1
    server2
    server3
    server4
    server5
    
  2. Jalankan CollectNode dengan melewati daftar serve:

    collectnode --file servers.txt --command='cat /etc/httpd/conf/httpd.conf |grep ^User'
    
  3. Optinally, dimungkinkan untuk memfilter hasil, misalnya perintah ini hanya menampilkan server di mana kondisi tercapai.

    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

Hanya pertanyaan untuk pertanyaan yang sangat bagus:

Solusi terbaik yang saya temukan adalah, tidak terlalu mengejutkan, tmux.

Anda dapat melakukan Ctrl-B: setw sinkronisasi-panel di tmux untuk resut yang luar biasa. Anda harus membuka semua koneksi ssh Anda, dalam panel 1 jendela Tmux yang berbeda untuk ini.

1
Mikhail Krutov

Saya pikir "berharap" adalah apa yang Anda butuhkan.
Banyak orang bahkan tidak tahu itu ada. Ini adalah program berbasis tcl yang akan membuat pertanyaan dan kemungkinan jawaban atas nama Anda. Lihat https://wiki.tcl-lang.org/page/Expect

0
Clement

Buat file/etc/sxx/hosts

mengisi seperti ini:

[grp_ips]
1.1.1.1
2.2.2.2
3.3.3.3

bagikan kunci ssh di semua mesin.

Instal sxx dari paket:

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

Kemudian jalankan perintah seperti ini:

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

Mungkin sesuatu seperti ini berfungsi, untuk menjalankan perintah pada beberapa host? misalkan semua host diatur dalam .ssh/config untuk login tanpa kata sandi.

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

0
Y0NG

Gunakan Paramiko http://www.paramiko.org/ dan paralelisme berbasis utas https://docs.python.org/3/library/threading.html .below kode memungkinkan untuk menjalankan beberapa perintah pada setiap server secara paralel!

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()

Catatan: ulangi instruksi di atas untuk setiap server.

0
Sharma