Как удаленно выполнять несколько команд на нескольких серверах?

Я пытаюсь автоматизировать эти шаги, так что мне не нужно делать это на всех машинах вручную. Мне нужно установить последнее программное обеспечение сервера приложений (abc.tar.gz) на все блоки unix.

Мне нужно сделать это примерно в 12 машинах – "machine1" ... "machine12" . У меня есть мастер-машина "machine0" которой есть файл abc.tar.gz поэтому я abc.tar.gz запустить мой скрипт только с этой машины и установить программное обеспечение abc.tar.gz , выполнив следующие шаги на всех этих 12 машинах один за другим. Идентификатор моей учетной записи unix – это david и мой процесс выполняется как golden пользователь.

Это шаги, которые я abc.tar.gz если я устанавливаю abc.tar.gz в «machine1»:

 david@machine1:~$ sudo scp david@machine0:/home/david/abc.tar.gz . david@machine1:~$ sudo stop test_server david@machine1:~$ sudo su - golden golden@machine1:~$ cd /opt/process golden@machine1:/opt/process$ rm -rf * golden@machine1:/opt/process$ exit david@machine1:~$ sudo cp abc.tar.gz /opt/process david@machine1:~$ sudo chown -R golden /opt/process david@machine1:~$ sudo su - golden golden@machine1:~$ cd /opt/process golden@machine1:/opt/process$ tar -xvzf abc.tar.gz golden@machine1:/opt/process$ exit david@machine1:~$ sudo start test_server 

Как я могу автоматизировать это, чтобы он мог делать одни и те же шаги во всех 12 машинах один за другим? Я имею в виду abc.tar.gz установить abc.tar.gz в abc.tar.gz , а затем установить на machine2 и продолжить .. Я хочу запустить этот скрипт только с machine0 .

Есть ли способ автоматизировать это?

4 Solutions collect form web for “Как удаленно выполнять несколько команд на нескольких серверах?”

Я бы порекомендовал для этого инструмент подготовки, такой как Fabric или Ansible . Оба достаточно просты в настройке и позволят вам сделать больше именно то, что вам нужно в этом случае, так как вы сможете скомпоновать свои исходные playbooks или fabfile в зависимости от того, с каким инструментом вы работаете.

Документы для Fabric можно найти здесь: http://docs.fabfile.org/en/1.10/ Документы для Ansible можно найти здесь: http://docs.ansible.com/ansible/intro_getting_started.html

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

Что касается сценария, вы можете посмотреть на что-то вроде:

 MACHINES = ( 'machine1' 'machine2' ... ) for machine in "${MACHINES[@]}"; do # insert sequence of setup steps here. done 

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

pdsh может делать то, что вы хотите. По умолчанию он будет работать на нескольких компьютерах одновременно параллельно, но вы можете использовать опцию -f чтобы ограничить ее работой на каждом компьютере по одному, если хотите.

например

 # copy abc.tar.gz to /home/david on machine1..machine12 pdcp -w machine[1-12] abc.tar.gz /home/david # run a bunch of commands on machine1..machine12 # be careful of quoting pdsh -w machine[1-12] 'sudo stop service ; do something ; do something else ; sudo start service' 

В качестве альтернативы вместо того, чтобы ставить все команды в одиночных или двойных кавычках в командной строке pdsh , вы можете pdcp сценарий оболочки на удаленные компьютеры и запускать его с помощью одной команды.

 pdcp -w machine[1-12] abc.tar.gz /home/david pdcp -w machine[1-12] ./my-script.sh /tmp pdsh -w machine[1-12] sh -c '/tmp/my-script.sh' 

(используйте sh -c только в случае, если /tmp смонтирован noexec)

Это особенно полезно, если вы хотите избежать путаницы, имея несколько уровней вложенных кавычек (например, если вам нужно запустить некоторые команды с помощью sudo или su или вставить awk или sed или любой другой скрипт). Часто проще просто написать обычный скрипт (или awk или perl или любой другой), скопировать его туда, где это необходимо, и запустить его там.

pdsh также позволяет вам использовать файл под названием /etc/genders для определения машин и каких (произвольных) атрибутов, которые вы им назначаете. например

 machine0 master,all machine[1-12] machines,all web[1-4] webservers,all db[1-2] mysql,db,all 

Вы можете выбрать машины по атрибуту в командной строке pdsh или pdcp с помощью -g , например, pdcp -g machines abc.tar.gz /home/david или pdsh -g all uname -a или pdsh -g web,db,master uptime ,

pdsh был написан для использования в кластерах HPC, но я нашел его одинаково полезным для массового администрирования любой группы (групп) машин.

BTW, pdsh – это другой инструмент для puppet или ansible или cfengine т. Д. – они предназначены для установки и поддержки согласованной среды на группе машин (таких как кластер или ферма VM и т. Д.). pdsh больше подходит для запуска одноразовых команд и / или копий (от или до) на той же группе машин.

Я предпочитаю использовать xargs для таких задач. В качестве примера

 #/bin/sh cat serverlist.txt | xargs -I % sh -c 'ssh root@% 'date';'echo test'' 

И serverlist.txt содержит разделяемые строки / имена хостов.

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

  • «Nohup sudo ...» не запрашивает passwd и ничего не делает
  • Как запустить это в sudo?
  • Вызовите sudo от Jenkins
  • Безвестная sudo команды, содержащей запятую
  • Как установить фреймворк на удаленном сервере без привилегий root
  • Почему по умолчанию пользователь Debian не входит в список sudoer?
  • Ubuntu 14.04.2 LTS: для пользователей NIS SSH работает, но консольный вход и sudo fail
  • Ubuntu 16.04 su может требовать USB-устройства, но другие пользователи не могут
  • sudo и sssd не работают с группами пользователей
  • Какая потребность в команде `fakeroot` в Linux?
  • bash syntax - команда обертывания внутри sudo :: tail logs до тех пор, пока строка не будет найдена с таймаутом с использованием Terraform
  • Linux и Unix - лучшая ОС в мире.