it-swarm-tr.com

Birçok sunucuda SSH üzerinden komutları otomatik olarak çalıştır

Bir .txt dosyasında IP adreslerinin bir listesi vardır, örn .:

1.1.1.1
2.2.2.2
3.3.3.3

Her IP adresinin arkasında bir sunucu vardır ve her sunucuda 22 numaralı bağlantı noktasında çalışan bir sshd vardır. Her sunucu known_hosts listesi (bilgisayarımda Ubuntu 10.04 LTS/bash).

Bu sunucularda komutları nasıl çalıştırabilir ve çıktıyı nasıl toplayabilirim?

İdeal olarak, komutları tüm sunucularda paralel olarak çalıştırmak istiyorum.

Tüm sunucularda ortak anahtar kimlik doğrulaması kullanacağım.

İşte bazı potansiyel tuzaklar:

  • Ssh, verilen sunucuları ssh anahtarını known_hosts dosya.
  • Verilen komutlar, çıkışın potansiyel olarak geçersiz olduğunu belirten sıfır dışında bir çıkış kodu döndürebilir. Bunu tanımam gerek.
  • Örneğin bir ağ hatası nedeniyle belirli bir sunucuya bağlantı kurulamayabilir.
  • Komutun beklenenden daha uzun süre çalışması veya sunucunun komutu çalıştırırken kapanması durumunda bir zaman aşımı olmalıdır.

Sunucular AIX/ksh (ama bunun gerçekten önemli olmadığını düşünüyorum.

47
LanceBaynes

Pssh veya başkalarını yükleyemediğinizi varsayarsak, aşağıdakine benzer bir şey yapabilirsiniz:

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

Aynı anda birden fazla makinede oturum açmanıza ve komut dizisini çalıştırmanıza izin veren birkaç araç vardır. İşte bir çift:

62
Caleb

Python komut dosyasını bash komut dosyasından daha fazla kullanıyorsanız, Kumaş sizin için bir araç olabilir.

Kumaş ana sayfasından :

Fabric, uygulama dağıtımı veya sistem yönetimi görevleri için SSH kullanımını kolaylaştırmak için bir Python (2.5 veya daha yüksek) bir kütüphane ve komut satırı aracıdır.

Yerel veya uzak Kabuk komutlarını (normal veya Sudo aracılığıyla) yürütmek ve dosyaları yüklemek/indirmek için çalışan bir kullanıcının girdi istemesi veya yürütmeyi durdurma gibi yardımcı işlevler için temel bir işlem paketi sağlar.

Tipik kullanım, bir Python modülünün bir veya daha fazla işlevi içeren, ardından fab komut satırı aracıyla yürütülmesini içerir.

18
Riccardo Murri

Bunun için GNU paralel kullanıyorum, özellikle de this tarifi kullanabilirsiniz:

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

İle your.txt sunucunun IP adresi/adları olan dosyadır.

11
Anthon

Çok temel kurulum:

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

İsim/şifre ile kimlik doğrulaması gerçekten iyi bir fikir değildir. Bunun için özel bir anahtar ayarlamanız gerekir:

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

Ben öneririm Ansible.cc . Bu bir yapılandırma yöneticisi ve komut dağıtıcısıdır.

4
Tom

Hypertable projesi yakın zamanda bir çok Ana Bilgisayar ssh aracı ekledi. Bu araç libssh ile oluşturulur ve senkronize olmayan bağlantılar ve paralel olarak oluşturur maksimum paralellik için. Tam dokümantasyon için Çok Ana Bilgisayarlı SSH Aracı konusuna bakın. Bir ana bilgisayar kümesinde bir komut çalıştırmak için, komutu aşağıdaki gibi çalıştırırsınız:

$ ht ssh 1.1.1.1,2.2.2.2,3.3.3.3 uptime

Ayrıca bir Ana Bilgisayar adı veya IP modeli de belirleyebilirsiniz, örneğin:

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

Ayrıca, her Ana Bilgisayarda komutun başlatılmasını 0 ile --random-start-delay <millis> Milisaniye arasında rastgele bir zaman aralığıyla geciktirecek bir <millis> Seçeneğini de destekler. Bu seçenek, çalıştırılan komut merkezi bir kaynağa eriştiğinde sürü sorunlarının giderilmesini önlemek için kullanılabilir.

2
Doug judd

Bence pssh ve her zamanki scp, rsync, vb ilgili paralel sürümleri arıyorsunuz.

2
unclejamil

Bu tür işleri kolaylaştırmak için Overcast adlı açık kaynaklı bir araç oluşturdum.

İlk önce sunucularınızı tanımlayın:

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

Ardından, sırayla veya paralel olarak, birden fazla komut ve komut dosyası çalıştırabilirsiniz:

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

Ben geliştirdim collectnode Görevleri birkaç sunucuda (windows dahil) yürütmek için çok basit ve etkili

CollectNode nasıl kullanılır:

  1. Çalışmak için sunucu listesini oluşturun:

    # cat hosts.file
    server1
    server2
    server3
    server4
    server5
    
  2. Sunum listesini geçen CollectNode'u yürütün:

    collectnode --file servers.txt --command='cat /etc/httpd/conf/httpd.conf |grep ^User'
    
  3. Tercihen, sonuçları filtrelemek mümkündür, örneğin bu komut yalnızca koşulun yerine getirildiği sunucuyu görüntüler.

    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

Gerçekten güzel bir soru için sadece bir kafa karıştırıcı:

Bulduğum en iyi çözüm, şaşırtıcı değil, tmux.

Şaşırtıcı bir sonuç için ctrl-B: setw senkronizasyon panellerini tmux'ta yapabilirsiniz. Bunun için 1 pencerenin Tmux penceresinin farklı bölmelerinde tüm ssh bağlantılarınızı açmış olmalısınız.

1
Mikhail Krutov

Sanırım ihtiyacın olan "beklemek".
Birçok insan var olduğunu bile bilmiyor. Sizin adınıza soru ve olası cevaplar verecek bir tcl tabanlı programdır. https://wiki.tcl-lang.org/page/Expect adresine bir göz atın

0
Clement

/ Etc/sxx/hosts dosyası oluşturma

şöyle doldurun:

[grp_ips]
1.1.1.1
2.2.2.2
3.3.3.3

ssh anahtarını tüm makinelerde paylaş.

Sxx paketinden yükleyin:

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

Sonra komutu şu şekilde çalıştırın:

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

Belki böyle bir şey, birden fazla ana bilgisayarda komut çalıştırmak için çalışır? tüm ana makinelerin şifresiz giriş için .ssh/config olarak ayarlandığını varsayalım.

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

0
Y0NG

Paramiko http://www.paramiko.org/ ve İş parçacığı tabanlı paralellik https://docs.python.org/3/library/threading.html .below kullanın kodu paralel olarak her sunucuda birden fazla komut yürütülmesine izin verir!

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

Not: her sunucu için yukarıdaki talimatları tekrarlayın.

0
Sharma