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:
known_hosts
file.Servernya AIX/ksh (tapi saya pikir itu tidak terlalu masalah.
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"
Ada beberapa alat di luar sana yang memungkinkan Anda untuk masuk dan menjalankan serangkaian perintah pada banyak mesin secara bersamaan. Berikut adalah pasangannya:
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.
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.
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
Saya sarankan Ansible.cc . Ini adalah manajer konfigurasi dan dispatcher perintah.
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.
Saya pikir Anda sedang mencari pssh dan versi paralel terkait dari scp, rsync, dll.
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
Saya telah mengembangkan collectnode Sangat sederhana dan efektif untuk menyelesaikan tugas di beberapa server (termasuk windows)
Cara menggunakan CollectNode:
Buat daftar server, untuk bekerja dengan:
# cat hosts.file
server1
server2
server3
server4
server5
Jalankan CollectNode dengan melewati daftar serve:
collectnode --file servers.txt --command='cat /etc/httpd/conf/httpd.conf |grep ^User'
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/
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.
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
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"
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
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.