Вам необходимо запустить процесс на 100 linux серверах одновременно ваши действия

Обновлено: 07.07.2024

Если вы администрируете несколько Linux-серверов, вы неизбежно столкнетесь с тем, что довольно часто приходиться проделывать одни и те же операции над всеми серверами. Например: вносить изменения в конфигурационные файлы (/etc/hosts, скрипты инициализации и т.п.), или производить разовую архивацию на всех серверах. После очередной пресной порции обезьяньей работы мы понимаем, что это не linux-way. Что можно сделать?

Стандартный подход

1. Вносим необходимые правки в /etc/hosts.
2. Копируем на каждый из серверов:

3. Вводим пароль.
4. Опять выполняем команду копирования:

5. И снова вводим пароль.
.
17. И последний раз вводим пароль.
То есть выполняем 17 нудных действий. Пришло время подняться на первую ступень просвещения.

Ускоренный стандартный подход

Для начали избавимся от необходимости ввода пароля при входе по ssh или выполнения копирования посредством scp. Для этого мы сгенерируем пару ключей на локальной машине:

Несколько раз нажимаем Enter на все задаваемые вопросы. А затем скопируем этот ключ на все сервера стандартной командой ssh-copy-id, попутно вводя пароль. Можно копировать по одному:

1. Копируем ключ сначала на одну машину:

2. Вводим пароль.

3. Копируем ключ на слеующую машину:

16. Последний пароль.

А лучше в ускоренном режиме:
1. Копируем ключи поочередно на каждую из машин, список которых в файле

2. Вводим пароль.
3. Следующий пароль.
.
8. Последний пароль.

Все!
Это и правда все, то есть всего 2 (два) действия. Этой конструкцией можно горы свернуть, но не все, к сожалению. Например, мы сможем выполнить любую команду для каждого из серверов, но мы не увидим вывода этой команды. Можем смириться или двигаться на следующую ступень просветления.

Нам просто нужно узнать время работы с последней перезагрузки стандартной командой uptime, но со всех серверов. Для этого нам придется воспользоваться одной из программ для параллельного выполнения комманд.

Программы для параллельного выполнения команд

Так как проблема существует не первый день, решений придумана масса, с довольно различными реализациями и подходом :

Из них бы я особо выделил pssh, pdsh, shmux. А из этих трех мне приглянулся pdsh, за то что: написан на С, давно разрабатывается, часто обновляется, и есть в репозиториях практически всех современных систем (кроме Slackware). И самое главное - не требуется установка на сервера, только на машине, откуда будете работать.

PDSH - высокопроизводительная, распараллеленная оболочка (по крайней мере так говорится на официальном сайте. Для доступа к серверам использует либо rsh, либо ssh, что предпочтительней. А так же использует модули расширения, которых мы касаться не будем. Установка, думаю, проблем не вызовет:

Синтаксис программы прост:

Вот и все, задача решена. Правда вывод мы получили вразнобой, так как задачи выполняются параллельно, и вывод происходит по мере поступления (в shmux проблема решена). Но сама команда выглядит монструозной, не правда ли? Для решения этой проблемы у pdsh есть свой синтаксис, который отличается от синтаксиса bash из примера, думаю, будет понятно:

Получилось немного короче. А когда серверов 50, разница будет потрясающая.

Если вывод многострочный, да еще и задерживается, мы получим кашу, то есть строки будут поступать на экран по мере формирования. Частично решить проблему можно такой конструкцией:

Если мы хотим выполнить некий скрипт на всех серверах содержащий спецсимволы "; & && | || " обязательно возьмите всю выполняемую команду в кавычки. В противном случае интерпретатор (bash) решит, что команда, выполняемая после спецсимвола, предназначена для локальной машины. Например:

Интересно, что сделает скрипт, если мы кавычки забудем?

Просто, да? Единственная трудность в том, что для этого pdsh должен быть установлен на всех машинах, но ведь теперь это не проблема:

А можно все это еще ускорить или упростить? Можно и нужно, последняя ступень просвещения и выход на космические скорости.

Редактируем .bashrc

Если мы управляем несколькими группами серверов, например хостинговыми (50шт) с Debian, сервера внутреннего проекта (24шт) со Slackware и офисные сервера (10шт) c Fedora. Тогда было бы удобно разделить их на группы. У pdsh на этот счет есть решение, но заставить его работать на Slackware я так и не сумел. Поэтому я пошел по linux-way и добавил в

/.bashrc вот такие строки:

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

И, собственно, все. А если мы захотим узнать uptime на всех серверах, выполним следующее:

Что бы отчистить все сервера от бэкап-файлов, которые остаются после редактирования vim'ом, поступим так:

Думаю, нет необходимости подсчитывать количество сэкономленных телодвижений.

Итого

Если у вас до 10 нетребовательных к вниманию серверов, имеет смысл использовать ssh c аутентификацией по ключам и "ускоряющую конструкцию". Если более, то pdsh, pssh или shmux, дополненных .bashrc.

Статья, перевод которой мы сегодня публикуем, посвящена технологиям одновременного выполнения команд на нескольких Linux-серверах. Речь здесь пойдёт о нескольких широко известных инструментах, реализующих подобный функционал. Этот материал пригодится системным администраторам, которым, например, регулярно приходится проверять состояние множества удалённых систем. Предполагается, что у читателя уже имеется несколько серверов, к которым организован доступ по SSH. Кроме того, при одновременной работе с несколькими машинами весьма полезно настроить SSH-доступ к ним по ключу, без пароля. Такой подход, с одной стороны, повышает безопасность сервера, а с другой — облегчает работу с ним.




1. PSSH — Parallel SSH

PSSH — это опенсорсный набор инструментов командной строки, написанный на Python и предназначенный для параллельного выполнения SSH-команд на множестве Linux-систем. Он быстро работает и лёгок в освоении. PSSH включает в себя такие средства, как parallel-ssh , parallel-scp, parallel-rsync , parallel-slurp и parallel-nuke (подробности об этих средствах можно посмотреть в man).

Перед установкой parallel-ssh в Linux-системе сначала надо установить pip . Вот как это делается в разных дистрибутивах:


Затем parallel-ssh устанавливают с использованием pip :


Далее, нужно внести имена хостов или IP-адреса удалённых Linux-серверов и сведения о портах в файл hosts (на самом деле, назвать его можно как угодно). Тут нам пригодится такая команда:


Вот пример содержимого такого файла:


После того, как в файл будет внесено всё необходимое, пришло время запустить parallel-ssh , передав этой утилите имя файла с использованием опции -h , а также — команды, которые нужно выполнить на всех серверах, адреса которых имеются в файле hosts . Флаг -i утилиты используется для того, чтобы вывести на экран то, что попадёт в стандартные потоки вывода и ошибок после завершения выполнения команд на серверах.

Команда запуска parallel-ssh может выглядеть так:


На следующем рисунке показано использование утилиты при работе с тремя серверами.


Утилита parallel-ssh выполняет команды на нескольких серверах

2. Pdsh — Parallel Remote Shell Utility

Pdsh — это, опять же, опенсорсное решение, представляющее собой оболочку для одновременного выполнения команд на нескольких Linux-серверах.

Вот как установить pdsh в различных дистрибутивах:


Для того чтобы выполнять команды на нескольких серверах, адреса этих серверов, как и при использовании parallel-ssh , надо добавить в файл, который тоже можно назвать hosts . Затем нужно запустить pdsh в следующем виде:


Здесь флаг -w используется для указания файла со списком серверов, флаг -R применяется для указания модуля удалённых команд (среди доступных модулей удалённых команд имеются ssh , rsh , exec ; по умолчанию используется rsh ). Обратите внимание на значок ^ перед именем файла со списком серверов.

Вот как выглядит работа с этой командой.


Выполнение команд на нескольких серверах с использованием pdsh

Если вы, при вызове pdsh , не указали список команд, которые надо выполнить на серверах, эта утилита запустится в интерактивном режиме. Подробности о pdsh можно узнать на соответствующей странице man.

3. ClusterSSH

ClusterSSH — это инструмент командной строки, предназначенный для администрирования кластеров серверов. Он запускает консоль администратора и, для каждого сервера, отдельное окно xterm . После этого на всех этих серверах можно одновременно выполнять одни и те же команды.


Теперь, для подключения к серверам, нужно выполнить команду следующего вида:


Можно воспользоваться и такой конструкцией:


После этого вы увидите нечто, подобное тому, что показано на следующем рисунке.


Работа с несколькими серверами с помощью clusterssh

Команды, введённые в консоли администратора, выполняются на всех серверах. Для выполнения команд на отдельном сервере нужно вводить их в окне, открытом для него.

4. Ansible

Ansible — это популярный опенсорсный инструмент для автоматизации IT-процессов. Он используется для настройки систем и для управления ими, для установки приложений и для решения других задач.


После этого надо добавить адреса серверов в файл /etc/ansible/hosts .


Вот пример фрагмента подобного файла с несколькими системами, объединёнными в группу webservers :


Теперь, для того, чтобы получить сведения команды uptime и узнать, какие пользователи подключены к хостам, входящим в группу webservers , можно воспользоваться следующей конструкцией:


Здесь опция -a используется для указания аргументов, передаваемых модулю, а флаг -u позволяет задать имя пользователя по умолчанию, применяемое для подключения к удалённым серверам по SSH.

Обратите внимание на то, что интерфейс командной строки ansible позволяет выполнять команды лишь по одной.


Взаимодействие с несколькими серверами средствами ansible

Итоги

В этом материале мы рассказали об инструментах, которые предназначены для одновременного выполнения команд на нескольких серверах, работающих под управлением Linux. Если вы подумываете об автоматизации задач по управлению множеством серверов — надеемся, вы найдёте здесь что-нибудь такое, что вам подойдёт.

date

24.05.2020

directory

CentOS, Linux

comments

комментария 3

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

PDSH (parallel distributed shell) — высокопроизводительная утилита для параллельного запуска команд на большом количестве Linux-серверов через ssh. По умолчанию pdsh позволяет поддерживать 32 параллельных соединения с управляемыми северами. Для pdsh есть несколько полезных модулей расширения, которые мы также рассмотрим в этой статье.

С помощью pdsh вы можете:

  • Обновлять ПО на серверах;
  • Установить необходимые модули или утилиты;
  • Запустить какой-то bash скрипт;
  • Проверить наличие обновлений и многое другое.

Установка PDSH и дополнительных модулей

Сначала нужно установить утилиту pdsh и нужные модули. В CentOS установка выполняется через менеджер пакетов yum:

yum install epel-release -y – подключаем репозиторий Epel

установке pdsh в linux centos

В целом для настройки pdsh больше ничего и не нужно. Мы установили сам pdsh, а так же установили дополнительный модуль pdsh-mod-genders, о котором я расскажу чуть позже, когда мы перейдем к запуску команд на удаленных серверах.

Настройка сервера управления pdsh и управляемых Linux-серверов.

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

Запустив команду ssh-keygen -q на все вопросы просто жмем Enter. Ключ готов, теперь осталось скопировать его на управляемые Linux-сервера. В качестве примера я взял 2 сервера с Linux CentOS.

На управляемых серверах создайте директорию для ssh ключа (если таковой нет):

Скопируем ключ в данный каталог, я это делаю через echo:

echo -e "ваш ключ с файла /root/.ssh/id_rsa.pub" >> /root/.ssh/authorized_keys

ssh ключи

Ключ добавлен, нужно проверить проходит ли соединение с pdsh-сервера:

проверка авторизации по ssh ключю

Примеры использования pdsh для запуска команд на множестве серверов

Так как ряд серверов может отличаться по hostname , я для себя сделал такую схему настройки PDSH. В файл hosts на управляющем сервере с pdsh я добавляю каждый управляемый сервер и присваиваю ему удобное мне имя, например:

Где вместо звездочек нужно указать IP destination-серверов.

Чтобы pdsh мог подключиться на заданные имена серверов, в файле /root/ssh/known_hosts к ключу каждого управляемого сервера, через запятую нужно добавить желаемое имя сервера, которое мы указали в /etc/hosts. Например:

/root/ssh/known_hosts

После этого вы сможете подключаться по тому hostname, которое выбрали для удобства, это нам пригодится, если у нас будет 100500 серверов, которые именуются вразнобой.

Для запуска команды на удаленном сервере через pdsh используется такой конструкция:

pdsh -w server1 'команда' — я всегда советую брать в кавычки запускаемые команды, так как если вы будете использовать спецсимволы, bash на сервере с pdsh выполнит команду после спецсимвола локально.

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

pdsh -w server1 'date'

pdsh -w server2 'date'

Или выполнить одну команду сразу для списка серверов:

pdsh -w server1,server2 'date'

Если нужно выполнить команду на 10-ти серверах, получится довольно длинная команда с перечислением всех серверов, что неудобно. Т.к. мы задали собственные hostname для серверов, и pdsh это понимает, при вызове pdsh можно укажите конкретные сервера или диапазон серверов в квадратных скобках:

pdsh -w server2 'date' — диапазон серверов в моем случае 2 сервера. Может быть от 1 до 20, выглядеть будет так: pdsh -w server9 'date'

pdsh -w server[1,2] 'date' — конкретные сервера 1 и 2, можно выбрать например 3-4 сервера и команды будет выглядеть следующим образом: pdsh -w server[1,2,7,9] 'date'

паралельный запуск команд через pdsh

Для более удобного форматирования вывод результатов команд с удаленных серверов можно использовать конструкцию:

pdsh -w server9 ‘uptime’ | sort -n

Рассмотрим ранее установленный модуль pdsh-mod-gendors. Чтобы воспользоваться им, создадим сам файл:

Для чего же он нужен? Genders – это файл с собственным синтаксисом для описания ролей pdsh. Как его можно применить в работе? Например:

    У вас есть 10 серверов с Ubuntu. Мы объединим их в одну группу Ubuntu, пусть их хостнеймы будут ubuntu1-10.
    В файл /etc/genders прописываем следующие строки:

Т.е. в файле /etc/genders вы можете создать различные группы Linux серверов. Чтобы pdsh читал данные из файла genders при запуске вместо ключа –w нужно указывать –g.

В моем случае сервера по-прежнему два, но это ничего не меняет:

Так гораздо удобнее и команда выполняется на всех серверах в группе.
По умолчанию pdsh позволяет запускать до 32 параллельных сессий на разных серверах. Количество одновременно запущенных команд указывается с помощью ключа –f. Например, при -f 1 пока команда не выполнится на первом сервере, ко второму она не перейдет.

На примере нашей команды это выглядит так:

pdsh -g ubuntu 'date' -f 1

Так же можно применять ключи -t и -u:

  • -t – установить время ожидания подключения в секундах;
  • -u – установить время ожидания выполнения удаленной команды.

И в заключении я хотел бы привести несколько примеров, как вы можете использовать pdsh при управлении группами серверов Linux.

Следующая команда на всех указанных серверха выполнит переход в указанноу нам директорию и скачает в нее iso-образ Centos 7:

pdsh -w server[1,2] cd /root && wget iso

Хотите быстро проверить какие репозитории установлены на управляемых серверах?

pdsh -w server[1,2] 'yum repolist'

удаленная паралельная установка apache сразу на несколько серверов

И проверим установилось ли действительно:

проверика установки apache в centos

То есть, можно выполнить какую угодно команду сразу на нескольких удаленных серверах. Если вы хотите запустить какой-то скрипт bash, я бы советовал добавить его в какой-то файл и скопировать на нужные сервера, после чего произвести его запуск.

На этом, пожалуй, все, надеюсь информация будет для вас полезной и облегчит рутинные задачи управления множеством серверов Linux.

Переходим на Ubuntu


3 способа оставить команду работать после выхода из сеанса SSH

3 способа оставить команду работать после выхода из сеанса SSH

При работе с удаленной системой по протоколу SSH часто возникает необходимость запуска команды, на выполнение которой требуется много времени. Как вы, возможно, знаете, после закрытия соединения SSH все выполняющиеся задания будут прерваны. Встаёт вопрос, как сделать так, чтобы команда продолжала выполняться даже после того, как соединение SSH будет закрыто.

Оставляем команду работать после закрытия сеанса SSH

На самом деле, существует множество способов решить эту задачу. Ниже приводятся наиболее простые и понятные.

Для запуска нового сеанса терминала выполните следующую команду:

Теперь можно запустить любую длительную команду. Для того, чтобы отключиться от сессии терминала, нажмите сочетание клавишь Ctrl+A, а затем d. В терминале появится что-то похожее на:

Чтобы вернуться в эту сессию, выполните команду

Вы увидите, что все запущенные процессы продолжают работу.
Если у вас есть несколько открытых сеансов screen , то при подключении нужно будет указать идентификатор сеанса. Для просмотра активных сеансов выполните следующую команду

Результат будет примерно таким:

Если нужно подключиться к сеансу с идентификатором 16648, выполните команду

Утилита tmux представляет собой мультиплексор терминала (мы писали о нём ранее), который позволяет создавать несколько терминалов, доступ к которым осуществляется с одного экрана. Сеансы tmux можно отключать от экрана, при этом они будут продолжать работать в фоновом режиме. Впоследствии к отключенным сеансам можно вернуться, точно так же, как и в случае с утилитой Screen . Для того, чтобы установить tmux в Ubuntu выполните следующую команду:

Для запуска мультиплексора выполните следующую команду:

Для того, чтобы отключиться от сеанса, нажмите в tmux сочетание клавишь Ctrl+b,а затем d. Для получения списка активных сеансов выполните команду

В первом столбце будет указан номер сеанса, который нужно указывать при подключении:

Болшее подробную информацию можно найти в руководстве по tmux.

Утилита nohup позволяет запускать команды, которые будут выполняться даже после отключения сеанса SSH. Это часть основных утилит GNU, и она уже установлена в системе. Использовать команду очень просто. После входа в удалённую систему достаточно выполнить:

И этого достаточно. Теперь можно закрыть закрыть сеанс SSH, удаленная задача будет продолжать выполняться.


Он содержит ряд инструментов для различных целей, таких как Parallel-ssh, Parallel-scp, parallel-rsync, parallel-slurp и parallel-nuke (более подробную информацию читайте на странице руководства конкретного инструмента).

Чтобы установить parallel-ssh, вам нужно сначала установить PIP в вашу Linux-систему.

Затем установите parallel-ssh с помощью pip следующим образом.

Затем введите имена хостов или IP-адреса удаленного Linux-сервера с SSH-портом в файле с именем hosts (вы можете называть его как хотите):

Сохраните файл и закройте его.

Теперь запустите parallel-ssh, укажите файл hosts с параметром -h и командой (-ами), которая будет выполнена на всех указанных серверах.

Флаг -i означает отображение std-вывода и std-ошибки по завершении выполнения команды на каждом сервере.


Он использует скользящее окно потоков для выполнения удаленных команд.

Чтобы установить Pdsh на ваши Linux-машины, выполните соответствующую команду ниже.

Чтобы запускать команды на нескольких серверах, добавьте серверы в файл hosts, как описано ранее.

Обратите внимание на символ ^ перед файлом hosts.

Если вы не указали удаленную команду, которая должна быть выполнена в командной строке, как показано выше, pdsh запускается интерактивно, запрашивая команды и запуская их при завершении возвратом

3. ClusterSSH

Он запускает консоль администрирования и xterm для всех указанных серверов, позволяя вам выполнять одну и ту же команду для всех из них.

Чтобы использовать clusterssh, начните с установки на локальном компьютере Linux, как показано далее

Теперь, когда вы его установили, сразу откройте консоль администратора и xterm на удаленных серверах, как показано ниже.

Чтобы запустить команду на всех серверах, щелкните по строке ввода xterm и введите команду; для управления одним хостом используйте консоль администратора.

Читайте также: