Запустить тот же скрипт на нескольких серверах через SSH

Мне регулярно нужно обновлять некоторые серверы Ubuntu 12.04 (Precise Pangolin) ( Rackspace ).

Что я сейчас делаю:

  • Скопируйте файл на сервер с помощью SCP
  • Войдите в систему с помощью SSH
  • Остановить Tomcat
  • Сделайте некоторое копирование и перемещение загруженного файла
  • Начать Tomcat

Повторите тот же процесс с тем же файлом на втором сервере (теперь 12 серверов и число растет).

Можно ли написать скрипт, который перебирает список серверов и делает все это для меня?

Как я могу это сделать? Предпочтительно, чтобы решение не требовало установки каких-либо вещей. Большинство в компании работает на MacBooks, но Windows VM в изобилии.

В идеале серверы, которые нужно обновить, можно просто добавить / удалить, чтобы изменить список серверов. Однако любое решение, которое экономит мне время на то же самое +12 раз, очень ценится 🙂

Для этого есть несколько решений: хотите ли вы продолжать ручное управление шагами и просто запускать их одновременно? Взгляд на CSSH (если вы исходите из системы Linux) или SuperPutty (если вы поступаете из системы Windows). Если вы просто хотите автоматизировать все, посмотрите на Expect .

Сделайте себе одолжение и проверьте Ansible . Похоже, это именно то, что вам нужно. Он использует SSH и масштабируется легко, все, что вам нужно сделать, это добавить серверы в список по мере необходимости. Учимся делать книжку, которая проведет вас днем ​​и сэкономит вам много часов в будущем.

Как уже упоминалось, есть инструменты, предназначенные для управления несколькими машинами, но для чисто решения bash вы можете написать цикл for и выполнить команды через ssh на нескольких узлах.

Предполагая, что host1 и host2 являются именами узлов ndoes, от которых вы хотите, чтобы это произошло:

 for node in host1 host2; do scp /tmp/script.sh user@$node:/tmp/script.sh if [[ "$?" == "0" ]];then #checks that last command didn't return an error ssh -oBatchMode=yes user@$node /tmp/script.sh fi done 

Если вы собираетесь использовать это решение, я рекомендую настраивать ключи ssh, чтобы вам не приходилось вводить пароль каждый раз. Параметр BatchMode заставит скрипт пропустить, а не ждать ввода, вы можете решить, предпочтительнее ли это.

@ Dave

В зависимости от сценария вы можете запускать все через ssh:

 for server in s1 s2 s3; do ssh $server "command one; command two; ..." done 

Или разделите его на несколько вызовов:

 for server in s1 s2 s3; do ssh $server command one ssh $server command two ... done 

Не стесняйтесь добавить это к своему ответу, просто пройдя мимо.