Назад | Перейти на главную страницу

Linux - выполнение одной и той же команды на многих машинах одновременно

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

Есть также ClusterSSH, который, ну, делает именно то, что вы думаете. Ура за описательное именование!

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

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

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

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

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

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

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

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


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

gsh похож на "for box in box1_name box2_name box3_name"решение уже дано, но я считаю, что gsh более удобен. Вы настраиваете файл / etc / ghosts, содержащий ваши серверы в группах, таких как web, 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 уже упоминалось и (насколько я понимаю) тоже может быть в этом списке.

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

Если вы находитесь на рабочем столе KDE, консоль есть опция «Отправить ввод для всех сеансов». Он применяется ко всем сеансам, открытым в одном окне консоли.

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

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

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

пример

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

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

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

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

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

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

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

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

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

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

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

пдш

Может принимать числовые диапазоны, выводит сначала имя хоста, на самом деле кажется поддерживается:

самая простая версия:

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 -i -H user@host -H user@host "sleep 5 && echo done"

Все они также могут брать список машин из файла.

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

mac: brew install pssh

Кластер SSH

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

Пример:

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

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

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

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

tmux

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

ctrl-b + %

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

ctrl+b <arrow-keys>

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

ctrl+b :setw synchronize-panes on

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

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