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

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

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

  • Команда не найдена ошибка - bash
  • Почему, когда я пытаюсь выполнить программу как обычный пользователь, мне становится отказано, и когда я выполняю его с помощью sudo, я получаю «Not Found»
  • JAVA_HOME не установлен в скрипте при запуске с использованием sudo
  • Как я могу сохранить * all * environment vars для определенной команды в sudo?
  • Почему пароль «sudo» отличается от пароля su?
  • Могу ли я создать суперпользователя * super *, чтобы у меня действительно был пользователь, который может лишить права root?
  • Команды «sudo» медленны во время работы в сети
  • Как я могу выполнить скрипт как root, выполнить некоторые команды в нем как конкретный пользователь и только одну команду как root
  • Как решить sudo: невозможно выполнить / bin / ls: слишком много аргументов
  • Выполнять вторую команду в цепочке как другой пользователь
  • Должны ли скрипты, требующие sudo fail, если у них их нет, или использовать sudo и prompt?
  • Interesting Posts

    Как опустить символ $ при вводе пути, хранящегося в переменной?

    Как запустить сценарии запуска на Amazon linux?

    Разрешить безмоментное немодифицируемое программное обеспечение для привязки к портам 80 и 443

    Как настроить RStudio Desktop verion на машине CentOS 5?

    Нарушение поведения при проверке «3D-ускорения»

    linux: Отбросить грязные страницы для блочного устройства (при отключении usb)

    Назначение клавиш мыши клавиатуре

    Получить текущий часовой пояс на Centos 7

    Почему cron запускает удаленную команду по ssh на маршрутизаторе Cisco, прерывается?

    Смонтируйте раздел ntfs два раза

    проверка достоверности всех файлов в папке в зависимости от shebang

    Переключиться на спящий режим при закрытии крышки ноутбука?

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

    Tuxcut -software в ubuntu

    Раскрашивайте разные куски текста в одном и том же выпуске с разными цветами

    Linux и Unix - лучшая ОС в мире.