كيف يمكن أتمتة تشغيل الأوامر عن بعد عبر SSH إلى ملقمات متعددة بالتوازي ؟

StackOverflow https://stackoverflow.com/questions/243750

  •  04-07-2019
  •  | 
  •  

سؤال

لقد بحثت في جميع أنحاء قليلا عن أسئلة مماثلة ، ولكن بخلاف تشغيل أحد الأوامر أو ربما عدد قليل من الأوامر مع عناصر مثل:

ssh user@host -t sudo su -

ولكن ماذا لو كنت في الأساس تحتاج إلى تشغيل برنامج نصي على (دعنا نقول) 15 السيرفرات في وقت واحد.هل هذا ممكن في باش ؟ في عالم مثالي لا تحتاج إلى تجنب تثبيت التطبيقات إذا كان من الممكن سحب هذا قبالة.على سبيل الجدل, دعنا نقول فقط أنني بحاجة إلى القيام بما يلي في 10 تستضيف:

  1. نشر جديد القط الحاويات
  2. نشر تطبيق في الحاوية ، وتكوينه
  3. تكوين أباتشي عشقتك
  4. تحميل أباتشي

لدي السيناريو الذي يفعل كل ذلك ، ولكنها تعتمد على تسجيل الدخول إلى كافة ملقمات, سحب النص من الريبو ، ومن ثم تشغيله.إذا لم يكن هذا ممكن في باش ما البدائل تقترحين ؟ هل أنا بحاجة أكبر المطرقة ، مثل Perl (الثعبان قد يكون من المفضل منذ أستطيع أن أضمن الثعبان على جميع المربعات في RHEL البيئة بفضل يم/up2date)?إذا كان أي شخص يمكن أن تشير لي إلى أي معلومات مفيدة سيكون موضع تقدير كبير ، خاصة إذا كانت قابلة للتنفيذ في باش.أنا سأقبل Perl أو Python, ولكن أنا فقط لا أعرف تلك أيضا (العمل على هذا).وذلك بفضل!

هل كانت مفيدة؟

المحلول

في كثير من الأحيان, أنا فقط استخدام الأصلي Tcl نسخة من تتوقع.تحتاج فقط أن يكون ذلك على الجهاز المحلي.إذا أنا داخل البرنامج باستخدام بيرل ، أنا أفعل هذا مع صافي::SSH::نتوقع.لغات أخرى مماثلة "نتوقع" أدوات.

نصائح أخرى

يمكنك تشغيل البرامج النصية المحلية كما هو مبين من خلال تشي يانغ ، و/أو يمكنك استخدام هنا الوثيقة:

ssh root@server /bin/sh <<\EOF  
wget http://server/warfile    # Could use NFS here  
cp app.war /location  
command 1  
command 2  
/etc/init.d/httpd restart  
EOF 

مسألة كيفية تشغيل الأوامر على العديد من السيرفرات في وقت واحد جاء على بيرل القائمة البريدية الأخرى سوف تعطي نفس التوصية أعطى هناك, الذي هو استخدام gsh:

http://outflux.net/unix/software/gsh

gsh يشبه "for box in box1_name box2_name box3_name"حل سبق ولكن أجد gsh أن يكون أكثر ملاءمة.إعداد /etc/أشباح ملف يحتوي على الملقمات الخاصة بك في مجموعات مثل شبكة الإنترنت ، ديسيبل ، RHEL4, x86_64, أو أيا كان (رجل الأشباح) ثم يمكنك استخدام هذه المجموعة عند استدعاء gsh.

[pdurbin@beamish ~]$ gsh web "cat /etc/redhat-release; uname -r"
www-2.foo.com: Red Hat Enterprise Linux AS release 4 (Nahant Update 7)
www-2.foo.com: 2.6.9-78.0.1.ELsmp
www-3.foo.com: Red Hat Enterprise Linux AS release 4 (Nahant Update 7)
www-3.foo.com: 2.6.9-78.0.1.ELsmp
www-4.foo.com: Red Hat Enterprise Linux Server release 5.2 (Tikanga)
www-4.foo.com: 2.6.18-92.1.13.el5
www-5.foo.com: Red Hat Enterprise Linux Server release 5.2 (Tikanga)
www-5.foo.com: 2.6.18-92.1.13.el5
[pdurbin@beamish ~]$

يمكنك أيضا دمج أو تقسيم شبح المجموعات باستخدام ويب+db أو ويب-RHEL4 ، على سبيل المثال.

سوف أذكر أيضا أنه في حين لم تستخدم shmux, الموقع يحتوي على قائمة من البرامج (بما في ذلك gsh) التي تمكنك من تشغيل الأوامر على العديد من السيرفرات في وقت واحد. كابيسترانو وقد سبق ذكر (ما فهمت) يمكن أن يكون في تلك القائمة كذلك.

نلقي نظرة على أتوقع (man expect)

لقد إنجاز مهام مماثلة في الماضي باستخدام نتوقع.

يمكنك الأنابيب المحلية النصي إلى الملقم البعيد ثم تنفيذ ذلك مع أمر واحد:

ssh -t user@host 'sh' < path_to_script

وهذا يمكن أن يكون كذلك الآلي باستخدام المفتاح العمومي التوثيق و التغليف مع النصوص لأداء التنفيذ المتوازي.

يمكنك محاولة paramiko.نقية-الثعبان عميل ssh.يمكنك برنامج ssh الدورات.لا تثبيت على الأجهزة عن بعد.

ترى هذا المادة كبيرة على كيفية استخدامها.

لتعطيك هيكل دون الرمز الفعلي.

  1. استخدام scp لنسخ تثبيت/إعداد السيناريو إلى مربع الهدف.
  2. استخدام ssh استدعاء البرنامج النصي الخاص بك على جهاز التحكم عن بعد مربع.

كيف قد تكون مثيرة للاهتمام منذ ذلك الحين ، على عكس معظم الحلول المذكورة هنا الأوامر التي يتم تشغيلها في نفس الوقت.

(للاستخدام بلدي كتبت أبسط نصي صغير جدا مماثلة إلى GavinCattell هو واحد ، موثقة هنا - في الفرنسية).

هل نظرت في الأشياء مثل دمية أو Cfengine.فإنها يمكن أن تفعل ما تريد وربما أكثر من ذلك بكثير.

عن تلك التي تتعثر عبر هذا السؤال ، سوف تشمل إجابة يستخدم النسيج, الذي يحل بالضبط المشكلة الموضحة أعلاه:تشغيل الأوامر التعسفية على العديد من المضيفين على ssh.

بمجرد تثبيت النسيج, كنت إنشاء fabfile.py, وتنفيذ المهام التي يمكن تشغيلها على جهاز التحكم عن بعد المضيفين.على سبيل المثال, مهمة تحميل أباتشي قد تبدو مثل هذا:

from fabric.api import env, run

env.hosts = ['host1@example.com', 'host2@example.com']

def reload():
    """ Reload Apache """
    run("sudo /etc/init.d/apache2 reload")

ثم على الجهاز المحلي, تشغيل fab reload و sudo /etc/init.d/apache2 reload الأمر سيحصل تعمل على جميع المضيفين المحددة في env.hosts.

يمكنك أن تفعل ذلك بنفس الطريقة التي فعلت من قبل, فقط النصي بدلا من القيام بذلك يدويا.التعليمة البرمجية التالية أجهزة التحكم عن بعد إلى آلة اسمه 'المحلى' ويعمل الأمرين هناك.ما عليك القيام به هو ببساطة إدراج الأوامر التي تريد تشغيلها هناك.

che@ovecka ~ $ ssh loca 'uname -a; echo something_else'
Linux loca 2.6.25.9 #1 (blahblahblah)
something_else

ثم تكرار خلال كافة آلات تفعل شيئا مثل:

for box in box1_name box2_name box3_name
do
   ssh $box 'commmands_to_run_everywhere'
done

من أجل جعل هذا ssh العمل دون إدخال كلمات المرور في كل وقت, سوف تحتاج إلى إنشاء مفتاح المصادقة.يمكنك أن تقرأ عن ذلك في IBM developerworks.

يمكنك تشغيل الأمر نفسه على عدة سيرفرات في وقت واحد مع أداة مثل المجموعة ssh.الرابط هو مناقشة المجموعة ssh على حزمة دبيان اليوم بلوق.

حسنا الخطوة 1 و 2 ليس هناك هر مدير ويب واجهة ؛ هل يمكن أن نصي مع الضفيرة أو zsh مع libwww المكونات في.

سة كنت تبحث عن:1) الحصول على مطالبتك بكلمة مرور (استخدام مفاتيح) 2) تمرير الأوامر(s) على SSH هو فلكس, هذا هو مماثل rsh في شبكة موثوق بها.

وظائف أخرى قد تظهر لك ما يجب القيام به, و كنت على الأرجح استخدام sh جدا ولكن كنت تميل إلى استخدام perl مثل ssh tomcatuser@server perl -e 'do-everything-on-one-line;' أو هل يمكن أن تفعل هذا:

إما scp the_package.tbz tomcatuser@server:the_place/.
ssh tomcatuser@server /bin/sh <<\EOF
تحديد الاشياء مثل TOMCAT_WEBAPPS=/usr/local/share/tomcat/webapps
tar xj the_package.tbz أو rsync rsync://repository/the_package_place
mv $TOMCAT_WEBAPPS/old_war $TOMCAT_WEBAPPS/old_war.old
mv $THE_PLACE/new_war $TOMCAT_WEBAPPS/new_war
touch $TOMCAT_WEBAPPS/new_war [كنت عادة لا تضطر إلى إعادة تشغيل هر]
mv $THE_PLACE/vhost_file $APACHE_VHOST_DIR/vhost_file
$APACHECTL restart [قد تحتاج إلى تسجيل الدخول كما أباتشي المستخدم لتحريك هذا الملف وإعادة تشغيل]
EOF

تريد DSH أو توزيع شل التي تستخدم في مجموعات الكثير.هنا هو الرابط: dsh

لديك أساسا عقدة المجموعات (ملف مع قوائم العقد فيها) و تحديد عقدة المجموعة التي ترغب في تشغيل الأوامر على ثم يمكنك استخدام dsh ، وكأنك ssh لتشغيل الأوامر عليها.

dsh -a /path/to/some/command/or/script

أنه سيتم تشغيل الأوامر على جميع الأجهزة في نفس الوقت والعودة الإخراج مسبوقة مع المضيف.الأمر أو البرنامج النصي يجب أن يكون حاضرا على النظام ، لذلك مشترك NFS دليل يمكن أن تكون مفيدة لهذا النوع من الأشياء.

يخلق المضيف الأوامر ssh من جميع آلات الوصول إليها.قبل Quierati http://pastebin.com/pddEQWq2

#Use in .bashrc
#Use "HashKnownHosts no" in ~/.ssh/config or /etc/ssh/ssh_config 
# If known_hosts is encrypted and delete known_hosts

[ ! -d ~/bin ] && mkdir ~/bin
for host in `cut -d, -f1 ~/.ssh/known_hosts|cut -f1 -d " "`;
  do
    [ ! -s ~/bin/$host ] && echo ssh $host '$*' > ~/bin/$host
done
[ -d ~/bin ] && chmod -R 700 ~/bin
export PATH=$PATH:~/bin 

السابقين تنفيذ:

$for i in hostname{1..10}; do $i who;done

هناك أداة تسمى فلات (مرنة أتمتة أداة استكشاف الأخطاء وإصلاحها) التي تسمح لك تنفيذ البرامج النصية على عدة يونكس/لينكس يستضيف مع نقرة زر واحدة.هذا هو سطح المكتب واجهة المستخدم الرسومية التطبيق الذي يعمل على ويندوز وماك ولكن هناك أيضا سطر الأوامر جافا العميل.
يمكنك إنشاء وظائف دفعة وإعادة استخدامها في العديد من المضيفين.
يتطلب جافا 1.6 أو أعلى.

على الرغم من أنه موضوع معقد, يمكنني أن أوصي كابيسترانو.

لست متأكدا إذا كان هذا الأسلوب سوف تعمل كل ما تريد, ولكن يمكنك أن تجرب شيئا من هذا القبيل:

$ cat your_script.sh | ssh your_host bash

والتي سيتم تشغيل البرنامج النصي (الذي يقيم محليا) على الملقم البعيد.

Multixterm هو بارد من أجل القيام بذلك, و يسمح لك بسهولة وضع 1 ن الجهاز مرة أخرى في تسلسل.

مجرد قراءة جديدة بلوق باستخدام setsid دون أي مزيد من تركيب/تكوين إلى جانب التيار النواة.اختبار/التحقق من تحت Ubuntu14.04.

في حين أن الكاتب لديه تفسير واضح جدا و نموذج التعليمات البرمجية كما هنا هو السحر جزء لمحة سريعة:

#----------------------------------------------------------------------
# Create a temp script to echo the SSH password, used by SSH_ASKPASS
#----------------------------------------------------------------------
SSH_ASKPASS_SCRIPT=/tmp/ssh-askpass-script
cat > ${SSH_ASKPASS_SCRIPT} <<EOL
#!/bin/bash
echo "${PASS}"
EOL
chmod u+x ${SSH_ASKPASS_SCRIPT}

# Tell SSH to read in the output of the provided script as the password.
# We still have to use setsid to eliminate access to a terminal and thus avoid
# it ignoring this and asking for a password.
export SSH_ASKPASS=${SSH_ASKPASS_SCRIPT}
......
......
# Log in to the remote server and run the above command.
# The use of setsid is a part of the machinations to stop ssh 
# prompting for a password.
setsid ssh ${SSH_OPTIONS} ${USER}@${SERVER} "ls -rlt"

وهنا البرنامج النصي إلى الأوامر SSH على آلات متعددة ، قد تساعد:

#!/bin/bash
MACHINES="machine1 machine2 machine3 machine4 machine5 machine6"
for m in $MACHINES
do
        cmd="ssh $m '$*'"
        eval $cmd
done

حتى يمكن وضع هذا الأمر في المسار الخاص بك ، كما sshAll ، ثم اكتب فقط sshAll الأمر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top