Linux - запуск одной и той же команды сразу на нескольких машинах

У меня есть около десятка Linux-боксов, которые мне иногда нужны для запуска одной и той же команды. Есть ли более простой (или автоматизированный) способ сделать это, кроме входа на каждую машину и запуска команды, по одной за раз? Это не одни и те же команды все время, и это не в заданное время, поэтому это не что-то идеальное для таких инструментов, как cron,

17 ответов

Решение

Хм, может быть, pconsole это инструмент, который вы хотите.

Есть также ClusterSSH, который, в общем-то, делает именно то, что вы думаете. Yay для наглядного именования!

Ansible имеет возможность выполнять специальные команды, а также может расширяться для полного управления конфигурацией. Возможность совпадения по группам отличная.

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

Вы должны проверить Puppet вот статья linux.com о его настройке и использовании

Вы можете попробовать Capistrano. Первоначально это был инструмент развертывания Rails, но он стал много делать с удаленными машинами.

Для более полного подхода к администрированию нескольких машин вы можете попробовать Chef.

Не забывайте также о pssh и dsh; они оба очень похожи на gsh, о котором упоминал @Philip Durbin.

Если вы работаете на рабочем столе KDE, у konsole есть опция "Отправлять входные данные всем сеансам". Это относится ко всем сеансам, открытым в одном и том же окне консоли.

Думаю, я скопирую и вставлю свой ответ из Stack Overflow, что людям, похоже, понравилось.,,


Вопрос о том, как запускать команды на многих серверах сразу, встал на днях в списке рассылки Perl, и я дам ту же самую рекомендацию, которую я дал там: использовать gsh: http://outflux.net/unix/ программное обеспечение / GSH

gsh похож на "for box in box1_name box2_name box3_name"решение уже дано, но я считаю, что gsh более удобен. Вы настраиваете файл /etc/ghosts, содержащий ваши серверы в таких группах, как web, db, RHEL4, x86_64 или что-то еще (man ghosts), тогда вы используете эту группу, когда звоните гш.

[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 уже упоминался и (насколько я понимаю) также может быть в этом списке.

Вы также можете попробовать ssh [user@]hostname [command] а затем переберите имена хостов.

Я использовал ClusterSSH, и он работает. Тем не менее, за пределами определенного количества терминалов, это не хорошо масштабируется.

Я удивлен, что никто не упомянул xargs. Xargs идеально подходит для большинства вещей. На самом деле, мне так удобно, что я больше никогда не использую clusterssh.

пример

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

(Перезапустите apache на всех веб-хостах.)

Также взгляните на func. Func позволяет вам использовать модульную архитектуру для управления различными аспектами системы, от работы с пакетами до выполнения команд и т. Д. Он работает на клиент-серверном модуле по SSL и также имеет довольно гибкую схему аутентификации.

Если вы уже являетесь пользователем tmux, вам может понравиться tmux-cssh (расшифровывается как TMUX-C(luster)-SSH). Вы даете ему список имен серверов, и он открывает новое окно tmux с сеансом SSH, открытым для каждого сервера на его собственной панели. Все нажатия клавиш копируются в каждое окно. В зависимости от количества хостов вывод может быть трудным для чтения.

Другие инструменты:

RunDeck также может быть описан как облегченный ControlTier.

Эти инструменты дают вам не только оболочку кластера, но и веб-интерфейс, и вы можете сохранить свои рабочие места для будущего использования.

Вы также можете попробовать Cluster SSH (cssh). Я не использовал его, но на LinuxJournal.com есть статья под названием "Эффективное управление несколькими серверами", в которой говорится об этом.

Вот несколько примеров использования команд, упомянутых в других ответах:

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

макинтош: brew install pdsh

DSH

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

нужна настройка удаленной оболочки, иначе он будет использовать "rsh", который может быть, а может и не быть доступным.

макинтош: brew install dsh

pssh

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

Все они могут взять список машин из файла, по желанию, а также.

Не стесняйтесь добавлять больше примеров здесь, это вики сообщества

макинтош: brew install pssh

Кластер SSH

Кластерный SSH ("версия только для Mac", по-видимому, есть две версии, другая здесь есть) фактически открывает "реальные терминалы" с большим терминалом внизу, который отправляет входные данные всем остальным. Так что это как пользовательский интерфейс, который отправляет его нескольким.

Пример:

csshX hostname0[1-2] hostname3 затем введите в красное поле, и оно будет отображаться в каждом окне терминала, по одному на хост, чтобы оно всплыло.

макинтош: brew install csshx (старая версия, но все еще работает)

также есть brew install ansible FWIW

Используйте блюдо, простое и очень мощное! Этот сценарий изменил мою жизнь:) Один сценарий, чтобы управлять ими всеми!

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

Оболочка diligence 'dish' выполняет команды через ssh/rsh/telnet/mysql одновременно в нескольких системах. Смена пароля, обновление конфигурации, копирование файлов, проверка статуса и т. Д. На сотнях узлов становятся проще. Блюдо похоже на 'dsh' (распределенная оболочка) IBM, но, кроме того, позволяет удаленно выполнять команды, требующие аутентификации. По сравнению с другими пакетами с открытым исходным кодом, которые включают в себя распределенную оболочку (или аналогичные инструменты), такие как ClusterIt, оболочка танцора, параллельная распределенная оболочка или C3, блюдо является тонкой и простой в использовании оболочкой удаленной оболочки для случаев, когда требуется гибкое решение. Вы можете просмотреть страницу руководства блюда онлайн здесь.

Самый простой способ, который я нашел без установки или настройки большого количества программного обеспечения, — это использовать старый добрый tmux. Предположим, у вас есть 9 Linux-серверов. Выберите коробку в качестве основной. Запустите сеанс tmux:

      tmux

Затем создайте 9 разделенных панелей tmux, выполнив это 8 раз:

      ctrl-b + %

Теперь подключите SSH к каждому ящику на каждой панели. Вам нужно знать некоторые сочетания клавиш tmux. Для навигации нажмите:

      ctrl+b <arrow-keys>

После входа во все свои ящики на каждой панели. Теперь включите синхронизацию панелей, чтобы можно было вводить одно и то же в каждое поле:

      ctrl+b :setw synchronize-panes on

теперь, когда вы нажимаете любую клавишу, она отображается на каждой панели. чтобы выключить его, просто включите и выключите. для циклического изменения размера панелей нажмите ctrl+b <пробел>.

Для меня это работает намного лучше, так как мне нужно видеть каждый вывод терминала, поскольку иногда серверы выходят из строя или зависают по какой-либо причине при загрузке или обновлении программного обеспечения. Любые проблемы вы можете просто изолировать и решить индивидуально.

Другие вопросы по тегам