Я регулярно делаю вещи, где я циклично выполняюсь через список серверов для принятия некоторых мер. Например:
for s in `cat servers.txt` ; do
echo; echo $s
ssh $s 'do something'
done
Я задаюсь вопросом (с точки зрения оболочки), если существует более легкий способ сделать это, чем cat servers.txt
Да я знаю об инструментах как mcollective, capistrano, и т.д. - я часто делаю это для согласовывания mcollective проблем :-)
Мой быстрый и грязный... где servers.txt имеет ряд хостов или IP, однострочный.
#!/bin/bash
SERVER_LIST=/path/to/servers.txt
while read REMOTE_SERVER
do
ssh $REMOTE_SERVER "do_something_cool"
done < $SERVER_LIST
Я использую ClusterSSH .
.
Она открывает множество маленьких оболочек, и вы можете набирать их все в одно и то же время. Очень удобно, когда вы хотите выполнить одну и ту же команду на многих серверах, но все равно видите результат.
Я использую его вот так: clusterssh $(~/get-servers.sh)
, но очевидно, что вы можете сделать что-то вроде clusterssh $(cat servers.txt)
Результат выглядит следующим образом:
Он также доступен в виде пакета Debian.
Пожалуйста, сделайте себе одолжение и используйте что-нибудь предназначенное для этого. Вы уже знаете о mcollective, но мы с вами оба знаем, что для его работы нужна какая-то инфраструктура. Как и марионетки и шеф-повара.
clusterssh, parallel ssh и dancer shell являются небольшими простыми улучшениями по сравнению с shell'ом для цикла. Им не нужно больше инфраструктуры.
Но есть также ansible, который позволяет не только сделать это, но и написать многократно используемые "плейбуки" с несколькими шагами. В дополнение к sshd нужен python, но на практике мне никогда не приходилось устанавливать его отдельно, он всегда был доступен.
Ansible - единственная система управления конфигурацией, которую я попробовал, и которая также хорошо работает как инструмент для развертывания и оркестровки (для этого марионетке нужен mcollective и, возможно, capistrano/fabric, ...)
(Да, Puppet и Chef, а все остальное можно запускать без центрального сервера), но для управления вам нужно установить пакеты на хосты, которые не нужны)
.Для выполнения простой задачи в широком диапазоне серверов без использования какого-либо инструмента, предназначенного для этой цели, независимо от того, требуется ли для них предыдущая инфраструктура или нет, можно использовать простой скрипт оболочки под названием mussh
, распространяемый в виде пакета во многих дистрибутивах.
Вы можете вызвать его со списком хостов, списком команд, хранить обе вещи в файлах, и еще большим количеством опций, таких как интеграция ssh-agent
, поддержка прокси, ... Проверьте manpage на все подробности.
Пример может быть таким же простым, как:
$ mussh -H host_list.txt -C command_list.txt
Рассматривали ли вы возможность использования parallel-ssh? https://code.google.com/p/parallel-ssh/
Обычно я возвращаюсь к использованию этого метода, если/когда наша установка mco или марионетки сломана. Это еще одна зависимость для управления, но это того стоит, если у вас большой парк боксенов для управления - с добавленным бонусом - возможность выбирать, на скольких машинах работать в тандеме/параллели, или даже делать по одной за раз, как вы привыкли к bash.
.Вот как использовать xargs для распараллеливания этих ssh сессий:
cat servers.txt | xargs -IH -n1 -P0 ssh H 'some command to run'
Вы также можете добавить опции -n или -f для ssh, чтобы перенаправить stdin из /dev/null или поместить сессию в фоновом режиме. Если вам нужно ввести пароль для каждого хоста, то это вам не очень поможет, но если вы используете ключи ssh, то это работает очень хорошо.
.Не ответил. Хотя на самом деле не совсем понятно, о чем вы просите.
Существует проект под названием parallel SSH, который предоставляет параллельные версии ssh, scp и rsync.
Так что преимущество в том, что вам не нужно делать никакого скрипта оболочки, вы просто предоставляете ему список серверов для выполнения команды, и он будет делать это параллельно.
Это здорово, если у вас есть длинный набор ssh команд для выполнения, так как он будет делать их все параллельно, предлагая потенциально большое ускорение.
например
parallel-ssh -h myhosts.txt "echo 'hello world'"