Как я могу автоматизировать параллельное выполнение команд через SSH на нескольких серверах? - PullRequest
18 голосов
/ 28 октября 2008

Я немного искал похожие вопросы, но кроме выполнения одной команды или нескольких команд с такими элементами, как:

ssh user@host -t sudo su -

Однако, что если мне нужно запустить скрипт (скажем, на 15 серверах одновременно). Это выполнимо в Bash? В идеальном мире мне нужно избегать установки приложений, если это вообще возможно. Ради аргумента, давайте просто скажем, что мне нужно сделать следующее на 10 хостах:

  1. Развертывание нового контейнера Tomcat
  2. Разверните приложение в контейнере и настройте его
  3. Настройка Apache vhost
  4. Перезагрузить Apache

У меня есть скрипт, который делает все это, но он полагается на то, что я захожу на все серверы, вытаскиваю скрипт из репозитория и запускаю его. Если это невозможно в bash, какие альтернативы вы предлагаете? Нужен ли мне больший молоток, такой как Perl (Python может быть предпочтительнее, так как я могу гарантировать, что Python есть на всех блоках в среде RHEL благодаря yum / up2date)? Если кто-нибудь может указать мне какую-либо полезную информацию, она будет очень признательна, особенно если это возможно в bash. Я соглашусь на Perl или Python, но я просто не знаю их (работает над этим). Спасибо!

Ответы [ 21 ]

1 голос
/ 18 сентября 2013

Существует инструмент под названием FLATT (FLexible Automation and Устранение неполадок) , который позволяет выполнять скрипты на нескольких хостах Unix / Linux одним нажатием кнопки. Это настольное приложение с графическим интерфейсом, которое работает на Mac и Windows, но есть также клиент командной строки для командной строки.
Вы можете создавать пакетные задания и повторно использовать их на нескольких хостах.
Требуется Java 1.6 или выше.

1 голос
/ 06 июня 2012

Создает команду hostname ssh для всех машин, к которым получен доступ. по Quierati http://pastebin.com/pddEQWq2

#Use in .bashrc
#Use "HashKnownHosts no" in ~/.ssh/config or /etc/ssh/ssh_config 
# If known_hosts is encrypted and delete known_hosts

[ ! -d ~/bin ] && mkdir ~/bin
for host in `cut -d, -f1 ~/.ssh/known_hosts|cut -f1 -d " "`;
  do
    [ ! -s ~/bin/$host ] && echo ssh $host '$*' > ~/bin/$host
done
[ -d ~/bin ] && chmod -R 700 ~/bin
export PATH=$PATH:~/bin 

Ex Execute:

$for i in hostname{1..10}; do $i who;done
1 голос
/ 29 октября 2008

Вам нужен DSH или распределенная оболочка, которая часто используется в кластерах. Вот ссылка: dsh

У вас в основном есть группы узлов (файл со списками узлов в них), и вы указываете, в какой группе узлов вы хотите запускать команды, тогда вы используете dsh, как если бы вы использовали ssh для запуска команд на них.

dsh -a /path/to/some/command/or/script

Он запустит команду на всех машинах одновременно и вернет вывод с префиксом имени хоста. Команда или сценарий должны присутствовать в системе, поэтому общий каталог NFS может быть полезен для такого рода вещей.

1 голос
/ 28 октября 2008

Хотя это сложная тема, я настоятельно рекомендую Capistrano .

1 голос
/ 28 октября 2008

Ну, для шагов 1 и 2 нет веб-интерфейса менеджера tomcat; Вы можете написать это с помощью curl или zsh с подключаемым модулем libwww.

Для SSH вы ищете: 1) не запрашивается пароль (используйте ключи) 2) передать команду (и) в командной строке SSH, это похоже на rsh в доверенной сети.

Другие посты показали вам, что делать, и я, вероятно, тоже использовал бы sh, но у меня было бы желание использовать perl как ssh tomcatuser@server perl -e 'do-everything-on-one-line;', или вы могли бы сделать это:

либо scp the_package.tbz tomcatuser@server:the_place/.
ssh tomcatuser@server /bin/sh <<\EOF
определить такие вещи, как TOMCAT_WEBAPPS=/usr/local/share/tomcat/webapps
tar xj the_package.tbz или rsync rsync://repository/the_package_place
mv $TOMCAT_WEBAPPS/old_war $TOMCAT_WEBAPPS/old_war.old
mv $THE_PLACE/new_war $TOMCAT_WEBAPPS/new_war
touch $TOMCAT_WEBAPPS/new_war [обычно вам не нужно перезапускать кота]
mv $THE_PLACE/vhost_file $APACHE_VHOST_DIR/vhost_file
$APACHECTL restart [может потребоваться войти в систему как пользователь apache, чтобы переместить этот файл и перезапустить]
EOF

1 голос
/ 28 октября 2008

Вы можете сделать это так же, как и раньше, просто сделайте сценарий вместо того, чтобы делать это вручную. Следующий код удален к машине с именем 'loca' и запускает там две команды. Что вам нужно сделать, это просто вставить команды, которые вы хотите запустить там.

che@ovecka ~ $ ssh loca 'uname -a; echo something_else'
Linux loca 2.6.25.9 #1 (blahblahblah)
something_else

Затем, чтобы перебрать все машины, сделайте что-то вроде:

for box in box1_name box2_name box3_name
do
   ssh $box 'commmands_to_run_everywhere'
done

Для того, чтобы эта штука ssh работала без постоянного ввода паролей, вам нужно настроить аутентификацию по ключу. Вы можете прочитать об этом на IBM developerworks .

1 голос
/ 28 октября 2008

Одну и ту же команду можно запустить на нескольких серверах одновременно с помощью инструмента, подобного cluster ssh . Ссылка на обсуждение кластера ssh в пакете Debian дневного блога.

0 голосов
/ 28 августа 2014

Просто прочитайте новый блог , используя setsid без какой-либо дальнейшей установки / настройки, кроме основного ядра. Протестировано / проверено под Ubuntu14.04.

Хотя у автора есть очень четкое объяснение и пример кода, вот волшебная часть для быстрого взгляда:

#----------------------------------------------------------------------
# Create a temp script to echo the SSH password, used by SSH_ASKPASS
#----------------------------------------------------------------------
SSH_ASKPASS_SCRIPT=/tmp/ssh-askpass-script
cat > ${SSH_ASKPASS_SCRIPT} <<EOL
#!/bin/bash
echo "${PASS}"
EOL
chmod u+x ${SSH_ASKPASS_SCRIPT}

# Tell SSH to read in the output of the provided script as the password.
# We still have to use setsid to eliminate access to a terminal and thus avoid
# it ignoring this and asking for a password.
export SSH_ASKPASS=${SSH_ASKPASS_SCRIPT}
......
......
# Log in to the remote server and run the above command.
# The use of setsid is a part of the machinations to stop ssh 
# prompting for a password.
setsid ssh ${SSH_OPTIONS} ${USER}@${SERVER} "ls -rlt"
0 голосов
/ 10 марта 2010

Multixterm отлично подходит для этого и позволяет вам легко вернуть машину 1 из n в последовательность.

0 голосов
/ 28 октября 2008

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

#!/bin/bash
MACHINES="machine1 machine2 machine3 machine4 machine5 machine6"
for m in $MACHINES
do
        cmd="ssh $m '$*'"
        eval $cmd
done

Вы могли бы даже поставить это так, чтобы оно было на вашем пути, назвать его как-то вроде sshAll, а затем просто набрать команду sshAll.

...