Linux - รันคำสั่งเดียวกันบนเครื่องจำนวนมากในครั้งเดียว


39

ฉันมีกล่อง Linux ประมาณโหลที่บางครั้งฉันจำเป็นต้องเรียกใช้คำสั่งเดียวกัน มีวิธีที่ง่ายกว่า (หรือวิธีอัตโนมัติ) ในการทำสิ่งนี้นอกเหนือจากการล็อกออนเข้าสู่เครื่องแต่ละเครื่องและรันคำสั่งทีละรายการหรือไม่? cronมันไม่ได้เป็นคำสั่งเดียวตลอดเวลาและก็ไม่ได้ในเวลาที่กำหนดไว้ล่วงหน้าเพื่อให้มันไม่ใช่สิ่งที่เหมาะสำหรับเครื่องมือเช่น


คำถามที่คล้ายกันserverfault.com/questions/17931/…
hayalci

ในที่สุดรายชื่อที่ยอมรับ :)
rogerdpack

คำตอบ:


12

อืมบางทีpconsoleเป็นเครื่องมือที่คุณต้องการ


ว้าว pconsole ดูเท่มาก! ฉันติดตั้งมันไม่มีปัญหาและมันก็ดูดีมาก ขอบคุณ!
Chris Bunch

มันเป็นหนึ่งในเครื่องมือโปรดของฉันด้วย :) np
Node


8

คุณควรตรวจสอบ Puppet ที่นี่เป็นบทความ linux.com เกี่ยวกับการตั้งค่าและการใช้งาน


1
อืมหุ่นดูน่าสนใจทีเดียว ฉันจะดูมันถ้า pconsole เริ่มทำให้ฉันล้มเหลวเนื่องจากฉันมีมันทำงานอยู่และมันง่ายกว่าการเรียนรู้ภาษาของ Puppet ขอบคุณสำหรับคำแนะนำว่า!
คริสพวง

เครื่องมือ Marionette Collective (หรือที่เรียกว่า mcollective หรือ mco) มันเป็นส่วนหนึ่งของหุ่นเชิดที่ให้คุณทำสิ่งต่าง ๆ ในกลุ่มโฮสต์ตามข้อเท็จจริงของหุ่นเชิด
Brian Minton


8

คุณอาจลองCapistrano แต่เดิมมันเป็นเครื่องมือการปรับใช้ Rails แต่มันก็ทำหลายสิ่งหลายอย่างด้วยเครื่องระยะไกล

สำหรับ Aproach สมบูรณ์มากขึ้นกับการบริหารงานของเครื่องหลายคุณอาจต้องการที่จะลองเชฟ


8

Ansible มีความสามารถในการทำคำสั่ง ad hoc และสามารถขยายได้เพื่อจัดการการกำหนดค่าแบบเต็ม ความสามารถในการจับคู่ตามกลุ่มเป็นเลิศ

http://docs.ansible.com/intro_adhoc.html


ansibleทำงานได้ดีกับหลายร้อยเครื่องในครั้งเดียวหรือคุณสามารถกำหนดให้n เครื่องในเวลา
ลูกไก่

6

ฉันเดาว่าฉันจะคัดลอกและวางคำตอบของฉันจาก Stack Overflowซึ่งดูเหมือนว่าคนจะชอบ . .


ปัญหาของการรันคำสั่งบนเซิร์ฟเวอร์หลายรายการพร้อมกันเกิดขึ้นในรายชื่อผู้รับจดหมาย Perl ในวันอื่น ๆ และฉันจะให้คำแนะนำเดียวกันกับที่ฉันให้ไว้ซึ่งจะใช้ gsh: http://outflux.net/unix/ ซอฟแวร์ / GSH

gsh นั้นคล้ายคลึงกับfor box in box1_name box2_name box3_nameวิธีแก้ปัญหาที่ได้รับไปแล้ว แต่ฉันพบว่า gsh นั้นสะดวกกว่า คุณตั้งค่าไฟล์ / etc / ghosts ที่มีเซิร์ฟเวอร์ของคุณในกลุ่มเช่นเว็บ, db, RHEL4, x86_64 หรืออะไรก็ตาม (man ghosts) จากนั้นคุณใช้กลุ่มนั้นเมื่อคุณเรียก 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 ~]$

คุณยังสามารถรวมหรือแยกกลุ่มผีโดยใช้ web + db หรือ web-RHEL4 เป็นต้น

ฉันจะพูดถึงว่าในขณะที่ฉันไม่เคยใช้ shmux เว็บไซต์นั้นมีรายการซอฟต์แวร์ (รวมถึง gsh) ที่ให้คุณเรียกใช้คำสั่งบนเซิร์ฟเวอร์หลายเครื่องพร้อมกัน Capistranoได้รับการกล่าวถึงแล้วและ (จากสิ่งที่ฉันเข้าใจ) อาจอยู่ในรายชื่อนั้นเช่นกัน


5

หากคุณอยู่บนเดสก์ท็อป KDE konsoleมีตัวเลือก "ส่งข้อมูลเข้าสู่ทุกเซสชัน" มันใช้กับการประชุมทั้งหมดที่เปิดในหน้าต่าง konsole เดียวกัน


5

คุณสามารถลองssh [user@]hostname [command]แล้ววนรอบชื่อโฮสต์


2
สิ่งนี้ไม่ได้ตอบสนองส่วน "พร้อมกัน" (ต่อเนื่องไม่ใช่ขนาน) แต่เนื่องจากดูเหมือนจะไม่เป็นข้อกำหนดจากเนื้อหาของคำถามนี่อาจเป็นทางออกที่ดี
voretaq7

4

ยังดู func Func ช่วยให้คุณใช้สถาปัตยกรรมโมดูลเพื่อควบคุมแง่มุมต่าง ๆ ของระบบตั้งแต่การจัดการกับแพคเกจการรันคำสั่ง ฯลฯ มันทำงานบนไคลเอนต์ / เซิร์ฟเวอร์โมดูลผ่าน SSL และมีรูปแบบการตรวจสอบที่ค่อนข้างยืดหยุ่นเช่นกัน


นอกจากนั้น Func ยังถูกสร้างโดย Red Hat และมีแนวโน้มที่จะเห็นการใช้งานที่เพิ่มขึ้นในผลิตภัณฑ์ Fedora / RHEL ในอนาคต นี่เป็นสิ่งที่น่าจับตามองอย่างที่ฉันคาดหวังว่ามันจะกลายเป็นทางออกมาตรฐานสำหรับปัญหาประเภทนี้
Christopher Cashell

4

ฉันใช้ ClusterSSH และใช้งานได้ อย่างไรก็ตามนอกเหนือจากเทอร์มินัลจำนวนหนึ่ง

ฉันประหลาดใจที่ไม่มีใครพูดถึง xargs Xargs สมบูรณ์แบบสำหรับทุกสิ่ง ที่จริงแล้วฉันรู้สึกสบายใจกับมันมากและฉันไม่เคยใช้กลุ่มอีกต่อไป

ตัวอย่าง

echo -n host1 host2 host3 host4|xargs -d" " -n1 -P30 -I+ ssh + "sudo service apache2 restart"

(เริ่ม apache ใหม่บนโฮสต์เว็บทั้งหมด)


สำหรับผู้ติดตามที่-P30เป็นส่วนหนึ่งหมายถึง "วิ่ง 30 ของพวกเขาในแบบคู่ขนาน"
rogerdpack

4

หากคุณเป็นผู้ใช้ tmux อยู่แล้วคุณอาจสนุกกับtmux-cssh (ย่อมาจากTMUX-C(luster)-SSH) คุณให้รายชื่อเซิร์ฟเวอร์และเปิดหน้าต่าง tmux ใหม่ที่มีเซสชัน SSH เปิดให้แต่ละเซิร์ฟเวอร์ในบานหน้าต่างของตัวเอง การกดแป้นทั้งหมดจะถูกคัดลอกไปยังแต่ละหน้าต่าง ขึ้นอยู่กับจำนวนโฮสต์ผลลัพธ์ที่อ่านได้ยาก


1
ลิงค์ซับหนึ่งรายการไม่จำเป็นต้องมีประโยชน์ กรุณาอธิบาย ทำไมคุณแนะนำเครื่องมือนี้
Deer Hunter

3

เครื่องมืออื่น ๆ :

RunDeck ยังสามารถบอกสถานะเป็น ControlTier ที่มีน้ำหนักเบาได้

เครื่องมือเหล่านี้ไม่เพียงให้เชลล์คลัสเตอร์แก่คุณเท่านั้น แต่ยังเป็นส่วนหน้าเว็บและคุณสามารถบันทึกงานของคุณเพื่อใช้ในอนาคต


2

คุณสามารถลองใช้ Cluster SSH (cssh) ฉันไม่ได้ใช้มัน แต่มีบทความบน LinuxJournal.com ชื่อ "จัดการเซิร์ฟเวอร์หลายเครื่องอย่างมีประสิทธิภาพ" ที่พูดถึงมัน


1

ใช้จานง่ายและมีประสิทธิภาพมาก! สคริปต์นี้เปลี่ยนชีวิตของฉัน :) หนึ่งสคริปต์เพื่อควบคุมพวกเขาทั้งหมด!

http://nic-nac-project.org/~drimiks/gnu/dish.shtml

เชลล์ 'จาน' ขยันดำเนินการคำสั่งผ่าน ssh / rsh / telnet / mysql พร้อมกันในหลายระบบ การเปลี่ยนรหัสผ่านการอัพเดตการกำหนดค่าการคัดลอกไฟล์การตรวจสอบสถานะและอื่น ๆ บนหลายร้อยโหนดนั้นง่ายมาก Dish คล้ายกับ 'dsh' ของ IBM (เชลล์แบบกระจาย) แต่อนุญาตให้ดำเนินการคำสั่งระยะไกลที่ต้องการการพิสูจน์ตัวตนได้จากระยะไกล เมื่อเทียบกับแพคเกจโอเพนซอร์สอื่น ๆ ซึ่งรวมถึงเชลล์แบบกระจาย (หรือเครื่องมือที่คล้ายกัน) เช่น ClusterIt, เชลล์ของนักเต้น, เชลล์กระจายแบบขนานหรือ C3, จานเป็นตัวหุ้มเปลือกแบบรีโมตที่บางและใช้งานง่ายสำหรับกรณีที่ต้องการโซลูชันที่ยืดหยุ่น คุณสามารถเรียกดูหน้าคู่มือของจานออนไลน์ได้ที่นี่


1

นี่คือตัวอย่างบางส่วนที่ใช้คำสั่งที่กล่าวถึงในคำตอบอื่น ๆ :

pdsh

สามารถใช้ช่วงตัวเลขผลลัพธ์ที่มีชื่อโฮสต์ก่อนดูเหมือนว่าจะรักษาจริง:

รุ่นที่ง่ายที่สุด:

pdsh -w hostname echo done

เอาท์พุท:

hostname: done

ตัวอย่างที่ซับซ้อนมากขึ้น:

pdsh -w username@hostname[7-8],username@otherhost "sleep 5 && echo done"

เอาท์พุท:

hostname8: done
hostname7: done
otherhost: done

Mac: brew install pdsh

DSH

dsh -m user@host,user@host --remoteshell ssh --concurrent-shell -- "sleep 5 && echo done"

ต้องการการตั้งค่าเปลือกระยะไกลมิฉะนั้นจะใช้ "rsh" ซึ่งอาจจะมีหรือไม่มีก็ได้

Mac: brew install dsh

pssh

pssh -i -H user@host -H user@host "sleep 5 && echo done"

พวกเขาทั้งหมดสามารถรับรายการเครื่องจักรจากไฟล์หรือไม่ก็ได้เช่นกัน

อย่าลังเลที่จะเพิ่มตัวอย่างเพิ่มเติมที่นี่เป็นวิกิชุมชน

Mac: brew install pssh

คลัสเตอร์ SSH

Cluster SSH ("mac only version" เห็นได้ชัดว่ามีอีกสองรุ่นที่นี่ ) เปิดจริง "terminal จริง" กับ terminal ขนาดใหญ่ที่ด้านล่างที่ส่งอินพุตไปยังคนอื่น ๆ ทั้งหมด ดังนั้นมันจึงเหมือนกับ UI ที่ส่งออกไปยังหลาย ๆ

Ex:

csshX hostname0[1-2] hostname3 จากนั้นพิมพ์ลงในกล่องสีแดงและไปที่หน้าต่างเทอร์มินัลแต่ละหน้าต่างหนึ่งรายการต่อโฮสต์ที่ปรากฏขึ้น

mac: brew install csshx(เวอร์ชั่นเก่า แต่ยังใช้งานได้)

นอกจากนี้ยังมีbrew install ansibleFWIW

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.