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

39

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

Крис Банч
источник
аналогичный вопрос serverfault.com/questions/17931/…
hayalci
Наконец-то канонический список :)
rogerdpack

Ответы:

12

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

Узел
источник
Ничего себе, pconsole выглядит довольно круто! Я установил это без проблем, и это выглядит великолепно до сих пор. Благодарность!
Крис Банч
Это тоже один из моих любимых инструментов. :) np
Node
15

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

Йорг Миттаг
источник
404 на SourceForge, кажется, теперь он здесь, на GitHub .
Пабло А
8

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

трент
источник
1
Хм, кукольный выглядит довольно интересно. Я посмотрю на него, если pconsole начнет меня подводить, так как он у меня уже запущен, и это проще, чем изучение языка Puppet. Спасибо за предложение, хотя!
Крис Банч
В частности, инструмент Marionette Collective (также называемый mcollective или mco). Это часть кукол, которая позволяет вам делать что-то на группе хостов, основываясь на фактах кукол.
Брайан Минтон
8

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

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

Rkj
источник
8

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

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, содержащий ваши серверы в таких группах, как 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 уже упоминался и (насколько я понимаю) также может быть в этом списке.

Филипп Дурбин
источник
5

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

rgmarcha
источник
5

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

Джейсон В.
источник
2
Это на самом деле не удовлетворяет части «сразу» (она сериализуется, а не параллельно), но, поскольку это не является требованием от тела вопроса, это также может быть достойным решением.
voretaq7
4

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

Придерживаться
источник
Наряду с этим, Func разрабатывается Red Hat и, вероятно, будет широко использоваться в будущих продуктах Fedora / RHEL. Это определенно стоит посмотреть, так как я ожидаю, что это станет де-факто стандартным решением для такого рода проблем.
Кристофер Кашелл
4

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

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

пример

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

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

JDS
источник
для последователей -P30часть означает «запустить 30 из них параллельно»
rogerdpack
4

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

appleshampoo
источник
1
Однострочные ссылки не обязательно полезны. Пожалуйста, будьте описательными. Почему вы рекомендуете этот инструмент?
Охотник на оленей
3

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

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

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

Кристиан
источник
2

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

Брэд Бейенхоф
источник
1

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

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

Оболочка diligence 'dish' выполняет команды через ssh / rsh / telnet / mysql одновременно в нескольких системах. Смена пароля, обновление конфигурации, копирование файлов, проверка статуса и т. Д. На сотнях узлов становятся проще. Блюдо похоже на '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

макинтош: 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 затем введите в красное поле, и оно будет отображаться в каждом окне терминала, по одному на хост, чтобы оно всплыло.

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

есть также brew install ansibleFWIW

rogerdpack
источник