Linux - запуск одной и той же команды сразу на нескольких машинах
У меня есть около десятка Linux-боксов, которые мне иногда нужны для запуска одной и той же команды. Есть ли более простой (или автоматизированный) способ сделать это, кроме входа на каждую машину и запуска команды, по одной за раз? Это не одни и те же команды все время, и это не в заданное время, поэтому это не что-то идеальное для таких инструментов, как cron
,
17 ответов
Есть также ClusterSSH, который, в общем-то, делает именно то, что вы думаете. Yay для наглядного именования!
Ansible имеет возможность выполнять специальные команды, а также может расширяться для полного управления конфигурацией. Возможность совпадения по группам отличная.
Вы должны проверить 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 <пробел>.
Для меня это работает намного лучше, так как мне нужно видеть каждый вывод терминала, поскольку иногда серверы выходят из строя или зависают по какой-либо причине при загрузке или обновлении программного обеспечения. Любые проблемы вы можете просто изолировать и решить индивидуально.