PSSH ile Birden Fazla Sunucuyu Tek Merkezden Yönetmek
Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYcv1TVO' (Errcode: 28 - No space left on device) in /usr/share/nginx/html/syslogs/wp-includes/class-wpdb.php on line 2349
Bir çok sunucunuz ve sunucu kümeleriniz varsa, sunuculardaki herhangi bir genel yapılandırma değişikliği vs. gibi işlemler için çok fazla mesai harcayacağınız aşikardır. Aynı komutları farklı sunucularda tek tek çalıştırmak gibi rutin bir iş de elbet oldukça sıkıcı olacaktır. Bu gibi durumlarda zamanı efektif kullanmak adına tek bir yerden verilen komutların tüm sunucularda paralel olarak çalıştırılmasını sağlamak gibi bir çözüm epey işe yarayacaktır.
Elbette, böyle bir ihtiyaç için kullanılabilecek bir çok yazılım bulunuyor işte bu gibi yazılımlardan birisi de pssh (parallel ssh)'dır. Bu yazıda pssh kullanarak merkezi bir yerden verilen komutların birden fazla sunucuda eş zamanlı olarak nasıl çalıştırılabileceğine değineceğim.
pssh
Pssh, OpenSSH ve ilgili yazılımlarının paralel versiyonunu sunan küçük bir uygulama paketidir. Paket içerisinde gelen uygulamalar ve açıklamaları aşağıdaki gibidir:
- Parallel ssh (pssh) – Bir komutu, birden fazla makinada ssh üzerinden parallel olarak çalıştırmak için kullanılır.
- Parallel SCP (pscp) – scp'nin paralel versiyonu olan pscp, birden fazla sunucuya paralel olarak dosya/dizin kopyalamak için kullanılmaktadır.
- Parallel rsync (prsync) – pscp'ye benzer şekilde lokal sunucuda bulunan dosya veya dizinleri ssh üzerinden rsync kullanarak uzaktaki sunuculara kopyalamak için kullanılır.
- Parallel Nuke (pnuke) – Uzak sunucularda çalışan herhangi bir süreci sonlandırmak (kill) için kullanılır.
- Parallel slurp (pslurp) – pscp ya da prsync'nin tersine uzak sunucularda bulunan dosya ve ya dizinleri lokal sunucuya kopyalamak üzere kullanılır.
Ayrıca, pssh paketi ile birlikte psshlib isimli kütüphane de gelmektedir. Ben denemedim ancak bu kütüphane kullanılarak farklı uygulamaların parallel versiyonunu oluşturabilirsiniz.
Kurulum
Esasen pssh, hemen tüm *nix dağıtımlarının kendi paket yöneticileri kullanılarak kurulabilir. Örneğin freebsd'lerde /usr/ports/security/pssh dizini altında port edilmiştir. Ancak ben burada kaynak koddan kurulumu anlatacağım (böylece hangi OS'i kullanırsanız kullanın kurulum aşamaları aynı olacaktır.)
pssh'ı kullanabilmek için sisteminizde python yüklü olmalıdır. Eğer değilse, kuruluma geçmeden önce sisteminizin paket yöneticisini kullanarak python paketini yükleyin.
NOT: pssh'in şu anki son sürümü 2.1.1'dır ancak http://code.google.com/p/parallel-ssh/downloads/list adresinden yeni sürüm olup olmadığını kontrol edin ve varsa son sürüm paketi download edin. |
Ben kurulum işlemini bir Ubuntu üzerinde ve çalışma dizini olarak /usr/local/src dizinini kullanarak yaptım buna göre kurulum adımları aşağıdaki gibidir.
# cd /usr/local/src # wget http://parallel-ssh.googlecode.com/files/pssh-2.1.1.tar.gz # tar xvfz pssh-2.0.tar.gz # cd pssh-2.1.1 # wget 'http://peak.telecommunity.com/dist/ez_setup.py' # python ez_setup.py # python setup.py install
Herhangi bir sorun ile karşılaşmadıysanız pssh kullanıma hazır demektir. pssh –help komutunu verirseniz aşağıdaki gibi bir çıktı alırsınız.
Usage: pssh [OPTIONS] -h hosts.txt command [...] Options: --help show this help message and exit -h HOST_FILES, --hosts=HOST_FILES hosts file (each line "host[:port] [user]") -l USER, --user=USER username (OPTIONAL) -p PAR, --par=PAR max number of parallel threads (OPTIONAL) -o OUTDIR, --outdir=OUTDIR output directory for stdout files (OPTIONAL) -e ERRDIR, --errdir=ERRDIR output directory for stderr files (OPTIONAL) -t TIMEOUT, --timeout=TIMEOUT timeout (secs) (-1 = no timeout) per host (OPTIONAL) -O OPTIONS, --options=OPTIONS SSH options (OPTIONAL) -v, --verbose turn on warning and diagnostic messages (OPTIONAL) -A, --askpass Ask for a password (OPTIONAL) -P, --print print output as we get it (OPTIONAL) -i, --inline inline aggregated output for each server (OPTIONAL) Example: pssh -h hosts.txt -l irb2 -o /tmp/foo uptime
Şimdi pssh ve diğer araçların nasıl kullanılabileceğine değinmek istiyorum.
Yapılandırma
Bu aşamada pssh kullanabilmek için karar verilmesi gereken bir nokta bulunmaktadır. Pssh'ın uzak sunuculara ssh üzerinden login olurken şifre sormasını isteyebilirsiniz, bu şekilde pssh ile bir çok sunucuda çalışacak bir komut çalıştırdığınız zaman sunucularınıza ait şifre sorulacaktır.
Ancak bu durumda tüm sunucuların aynı (root) şifresine sahip olması gerekir. Güvenlik açısından sunucularınızın root şifreleri farklı olabilir, bu durumda pssh'ın şifre ile login yöntemini kullanamazsınız. Bu nedenle izleyebileceğiniz ikinci yol ise key tabanlı kimlik doğrulaması ile sunuculara şifresiz login olmaktır. (Bu yöntemi seçerseniz de anahtarlarınızı iyi muhafaza etmeniz gerekir.)
Ben, pssh'in her iki yöntemle için yapılandırılmasından da bahsedeceğim. Siz keyfinize göre birisini seçebilirsiniz.
1 – Sunuculara Şifre ile Erişim
Bu yöntemi kullanmak istemeniz durumunda küçük bir işlem dışında yapmanız gereken pek bir şey yok.
pssh şifre sorma işlemleri için python'un kütüphaneleri altında bulunan askpass.py isimli betiği kullanmaktadır. Bu betiğin ön tanımlı olarak çalıştırılma yetkisi yoktur. Bu nedenle bu dosyanın iznini 755 yapmalısınız.
askpass.py dosyası Ubuntu'larda, /usr/local/lib/python2.6/dist-packages/pssh-2.0-py2.6.egg/psshlib/ dizininde bulunuyor çalıştırma izni vermek için aşağıdaki komutu verebilirsiniz.
chmod 755 /usr/local/lib/python2.6/dist-packages/pssh-2.0-py2.6.egg/psshlib/askpass.py
Farklı bir dağıtım kullanıyor ve askpass.py dosyası ilgili dizinde bulunmuyorsa find ile aratabilirsiniz.
Şifre ile login yönteminde bundan başka yapılandırma işlemi bulunmuyor. pssh'ın kullanım sırasında şifre sorması için aşağıda, Kullanım başlığında anlatılan tüm komutlara pssh'dan sonra -A parametresini de eklemelisiniz.
Örn:
pssh -A -h /hosts.txt -i uptime
Kullanım bölümünde ssh key ile bağlantı üzerinden yapılan pssh komut örnekleri bulunduğundan -A parametresi kullanılmayacaktır. Siz şifre ile login olarak çalışmak istiyorsanız bu parametreyi kullanmayı unutmayın.
HATIRLATMA: Pssh ile root yetkisi gerektiren komutları çalıştırabilmek için uzak sunucuları ssh üzerinden root kullanıcısı ile login'e izin vermelidir. Çoğu linux dağıtımında ssh root login ön tanımlı açık ise de freebsd gibi sistemlerde bu özellik devre dışıdır. Konunun detayları aşağıdaki başlığın ikinci (public key'in scp ile kopyalanması) bölümünde anlatılmıştır. |
Şimdi bir diğer yöntem olan şifresiz login işlemlerine bakalım.
2 – Sunuculara Şifresiz Erişim (Key Based SSH Authantication)
Uzaktaki sunuculara şifresiz ssh bağlantısı kurabilmeniz için ssh-keygen ile bir anahtar oluşturup genel anahtarınızı uzak sunuculara kopyalamanız gerekir. ssh üzerinde key tabanlı kimlik doğrulaması için aşağıdaki yapılandırma adımları izlenebilir.
Öncelikle bir key oluşturup, public anahtarı uzak sunucuya kopyalayacağız.
SSH Key Oluşturmak
Uzak sunucuları yöneticeğiniz lokal bilgisayar üzerinde ssh-keygen kullanarak (passphrase kısımlarını boş geçerek) bir rsa key olşuturun.
crom@homelab-1:~$ ssh-keygen -t rsa
Komutun çıktısı aşağıdaki gibi olacaktır.
Generating public/private rsa key pair. Enter file in which to save the key (/home/crom/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/crom/.ssh/id_rsa. Your public key has been saved in /home/crom/.ssh/id_rsa.pub. The key fingerprint is: 99:bf:cd:4a:e9:c9:4e:9b:7c:7e:ee:79:ef:d3:b0:99 crom@homelab-1 The key's randomart image is: +--[ RSA 2048]----+ | | | | | | | . | | . X . | | E = S | | = X = | | = = T | | .o o o..o | +-----------------+ crom@homelab-1:~$
Görüldüğü gibi /home/kullaniciadi/.ssh dizini altında id_rsa ve id_rsa.pub olmak üzere iki 2048 bitlik anahtar dosyası oluşturuldu. Bu anahtarlardan id_rsa.pub, adından da anlaşılacağı gibi public anahtardır.
UYARI: Herhangi bir güvenlik sorunu yaşamamanız için ssh anahtarlarını iyi muhafaza etmeniz gerekir. Private key'iniz çalınırsa, public key'inizin bulunduğu sunucularınıza -bir firewall kontrolü yoksa- şifresiz olarak erişebilirler. |
Şimdi public anahtarı uzak sunuculara kopyalama işlemine geçebiliriz.
Public Key'in Uzak Sunucuya Kopyalanması
Bu işi scp kullanarak yapıyoruz ve public anahtarı uzaktaki sunucuların root kullanıcı dizinindeki .ssh dizininin altına kopyalıyoruz. Anahtarın root kullanıcısına ait dizine kopyalanması uzaktaki sunucularda root yetkisi ile komut çalıştırabilmeyi sağlamaktadır.
Mesela pnuke kullanarak sunuculardaki bir süreci kill etmek istemeniz durumunda root yekisine sahip olmanız gerekir. Ayrıca, diğer bir çok yönetim işlemi için de root yetkisi gerekecektir.
scp, ssh üzerinden kopyalama yaptığı ve kopyalama işlemi için root yetkilerine sahip olunması gerektiğinden, karşıdaki sunucunun ssh üzerinden root login'e izin vermesi gerekir. Çoğu linux dağıtımında (Örn: Debian, CentOS vs.) ssh root login default olarak açıktır (aslında güvenlik nedeni ile bunu kapatmış olmanız gerekir.) Fakat freebsd gibi sistemlerde bu özellik kapalıdır. Sonuç olarak uzak sunucularınız FreeBSD ise öncelikle ssh'ın root yetkisi ile logine izin vermesini sağlamalısınız.
Ben zorunlu olmaması durumunda hiç bir *nix OS'de root ile ssh login izni vermemekteyim, ancak bu gibi zorunlu durumlarda da erişimi kontrol altına almak için sadece belirli IP'lerden root ile logine izin vermekteyim. Bunu için gerekli olan /etc/ssh/sshd_config dosyasındaki openssh yapılandırması aşağıdaki gibidir:
PermitRootLogin yes AllowUsers [email protected] crom
Bu şekilde, root login'e sadece 192.168.12.12 ip'li makinadan izin verilmektedir. Ayrıca crom kullanıcısı da normal şekilde ssh login yapabilecektir. Siz de kendi ihtiyaçlarınıza göre bu şekilde bir güvenlik önlemi alınız.
(Eğer dosyada herhangi bir değişiklik yaptıysanız sshd servisini yeniden başlatın.)
Şimdi, kopyalama işlemini yapalım.
homelab-1 isimli ubuntu üzerinde oluşturulan ssh key'e ait id_rsa.pub isimli public key'i 192.168.12.20 ip'li uzak sunucunun root dizinine scp ile kopyalamak için aşağıdaki komutu kullanıyorum.
crom@homelab-1:~$ scp .ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys2
Benzer bir komut verdiğiniz zaman karşıdaki sunucunun root şifresini girmeniz istenecek şifreyi girdikten sonra kopyalama işlemi yapılacaktır. Ancak aşağıdaki gibi bir hata alabilirsiniz:
scp: /root/.ssh/authorized_keys2: No such file or directory
Bunun anlamı, karşıdaki sunucunun root kullanıcı dizininde .ssh isimli bir dizin olmamasıdır. Eğer o sunucu üzerinden başka herhangi bir sunucuya ssh bağlantısı kurmaduysanız bu dizinin bulunmaması normaldir. Böyle bir durumda, sunucuya root ile login olup ilgili dizini oluşturmalı ve ön tanımlı 755 olan izinleri sadece root kullanıcısının okuma/yazma yapabilmesi için 700'e set etmeniz gerekir:
# mkdir ~/.ssh # chmod 700 ~/.ssh
Bu işlemden sonra yukarıdaki scp komutunu yeniden çalıştırabilirsiniz; herhangi başka bir sorun çıkmayacaktır.
Not: Kopyalama işleminde uzak sunucunun root dizinine kopyalanacak .ssh/authorized_keys2 isimli dosyanın izinleri herkesin okuyabileceği şekilde 644 olacaktır. Bu dosyanın iznini sadece root'un okuyabilmesi için 600'e set etmenizi öneririm. (chmod 600 ~/.ssh/authorized_keys2)
Key işlemlerini tamamladıktan sonra uzak sunucularınıza root kullanıcısı ile şifresiz erişebilmeniz gerekir; kısaca aşağıdaki şekilde deneyebilirsiniz.
crom@homelan-1:~$ ssh [email protected]
Herhangi bir sorun yoksa pssh kullanımı ile ilgili diğer bölüme göz atabilirsiniz.
Kullanım
Ben burada pssh araçlarının en temel olanlarının en temel kullanım şekillerinden bahsedeceğim, bahsedilmeyen özelliklerin bir listesi için –help anahtarından yararlanabilirsiniz.
Öncelikle, merkezi yönetimin yapılacağı lokal bilgisayarın herhangi bir alanında bir dosya açarak, uzak sunucularının ip, port ve kullanıcı bilgilerini belirtiyoruz.
Örnek olarak benim test ortamında lokal bilgisayar olarak kullandığım Ubuntu'nun / (kök) dizininde hosts.txt isimli bir dosya bulunuyor ve içeriği şöyle:
192.168.12.20:22 root 192.168.12.21:22 root
Görüldüğü gibi pssh ile verilecek komutlar iki bilgisayarda (biri FreeBSD biri Debian) ve 22. porttan root kullanıcısı ile bağlanılarak çalıştırılacak. (sshd servisiniz default 22. portun dışındaki bir porttan çalışıyorsa bu portu belirtmelisiniz.)
Bu dosya tüm pssh araçları için gerekli olacaktır.
Şimdi pssh paketi ile birlikte gelen araçların kullanımlarına bakalım.
pssh
Yukarıdaki örneğe göre uzak sunuculardan uptime bilgisi çekmek için şu komut verilebilir:
$ pssh -h /hosts.txt -i uptime
Çıktı şu şekilde olacaktır:
[1] 02:14:37 [SUCCESS] 192.168.12.20:22 01:52:43 up 2:14, 1 user, load average: 0.00, 0.00, 0.00 [2] 02:14:37 [SUCCESS] 192.168.12.21:22 3:13AM up 390 days, 14:47, 2 users, load averages: 0.00, 0.00, 0.00
Mesela, uzak sunucuların /root dizini altında test isimli bir dizin açmak için mkdir komutunu şu şekilde verebilirsiniz.
$ pssh -h /hosts.txt -i "mkdir /var/test"
(boşluk içeren komutları “” arasında yazmalısınız.)
Şimdi uzak sunucularda ls komutu ile test dizinlerine bakalım.
$ pssh -h /hosts.txt -i "ls /root"
Çıktı şöyle olacaktır:
[1] 02:39:59 [SUCCESS] 192.168.12.20:22 test [2] 02:39:59 [SUCCESS] 192.168.12.21:22 test
Bir diğer kullanışlı araç ise pscp'dir.
pscp
pscp ile uzaktaki sunucularınıza dosya ya da dizin kopyalaması yapabilirsiniz.
Örnek olarak lokal bilgisayarın / (kök) dizininde bulunan bunukopyala.txt isimli dosyayı uzak sunucuların /tmp dizini altına şu şekilde kopyalayabiliriz.
$ pscp -h /hosts.txt /bunukopyala.txt /tmp/
Çıktısı şu şekilde olacaktır.
the command: "['scp', '-qC', '-P', '22', '/bunukopyala.txt', '[email protected]:/tmp/']" the command: "['scp', '-qC', '-P', '22', '/bunukopyala.txt', '[email protected]:/tmp/']" [1] 02:48:24 [SUCCESS] 192.168.12.20:22 [2] 02:48:24 [SUCCESS] 192.168.12.21:22
pssh kullanarak ls -l ile tmp dizinine bakarsanız bunukopyala.txt dosyasını görebilirsiniz:
[1] 02:52:00 [SUCCESS] 192.168.12.20:22 total 14 -rw-r--r-- 1 root root 9 2009-11-09 02:26 bunukopyala.txt [2] 02:52:00 [SUCCESS] 192.168.12.21:22 total 12 -rw-r--r-- 1 root wheel 9 Nov 9 03:46 bunukopyala.txt
Alt dizinleri ile bir dizin kopyalamak için ise şu şekilde bir komut kullanılabilir.
$ pscp -h /hosts.txt -r testdizini /tmp/
Bu örnekte, testdizini isimli dizin uzak sunucuların /tmp dizini altına kopyalanacaktır.
pssh ile ls çıktılarını alırsanız ilgili dizin ve altdizinlerini görebilirsiniz:
$ pssh -h /hosts.txt -i "ls /tmp/" [1] 03:01:19 [SUCCESS] 192.168.12.20:22 testdizini [2] 03:01:20 [SUCCESS] 192.168.12.21:22 testdizini $ pssh -h /hosts.txt -i "ls /tmp/testdizini" [1] 03:02:20 [SUCCESS] 192.168.12.20:22 altdizin test1 test2 [2] 03:02:21 [SUCCESS] 192.168.12.21:22 altdizin test1 test2 $ pssh -h /hosts.txt -i "ls /tmp/testdizini/altdizin" [1] 03:02:52 [SUCCESS] 192.168.12.20:22 alttest1 alttest2 [2] 03:02:53 [SUCCESS] 192.168.12.21:22 alttest1 alttest2
Bir diğer araç ise pnuke,
pnuke
Yazının başında bahsettiğim gibi pnuke ile uzak sunucularda çalışan süreçler kill edilebilmektedir.
Mesela, uzak sistemlerinizde aşağıdaki gibi bir sleep süreci başlatın.
# sleep 90 &
Sonrasında lokal bilgisayarınızdan bu süreçleri kill etmek için pnuke'u şu şekilde kullanabilirsiniz.
$ pnuke -h /hosts.txt sleep
Böylece, sleep süreci sonlandırılacaktır.
Evet temel olarak pssh ile ilgili bilgiler bu kadardı. Daha fazla bilgi için aşağıdaki linklere göz atabilirsiniz:
http://code.google.com/p/parallel-ssh/
http://www.theether.org/pssh/docs/0.2.3/pssh-HOWTO.html
http://www.linux.com/archive/feature/151340
Bu yazılar da ilginizi çekebilir:
- SSH Üzerinden Root Login Girişimlerinde Artış
- FreeBSD – Sendmail Smart Host Configuration
- SU Error – su: not running setuid
- Linuxlar’da SSH üzerinden Root Erişiminin Engellenmesi
- FreeBSD – immutable flag ile write protection
Yorumlar
Trackbacks
Yorumda bulunun.
Ayni isi Putty ile Windows ortaminda yapmak isterseniz puttycs kullanabilirsiniz.
http://blog.lifeoverip.net/2007/11/08/putty-ile-birden-fazla-sistemde-komut-calistirma/
[Cevapla]
Faydalı bir çalışma olmuş. Elinize sağlık çağrı hocam. Kullanmaya başladım :)
[Cevapla]
İlginize teşekkürler elinize sağlık.
[Cevapla]