- Одновременное управление несколькими серверами
- Задача # 1
- Стандартный подход
- Ускоренный стандартный подход
- Задача # 2
- Программы для параллельного выполнения команд
- Редактируем .bashrc
- Итого
- PDSH: Параллельное выполнение команд на нескольких Linux-серверах
- Установка PDSH и дополнительных модулей
- Настройка сервера управления pdsh и управляемых Linux-серверов.
- Примеры использования pdsh для запуска команд на множестве серверов
- Как запустить одновременно несколько команд в Linux
- Как запустить несколько команд в Linux в одно и тоже время?
- Используйте оператор точку с запятой «;»
- Использование логического оператора «&&»
- Использование логического оператора OR «||»
- Объединение нескольких оператор для выполнения нескольких команд в Linux
Одновременное управление несколькими серверами
Если вы администрируете несколько Linux-серверов, вы неизбежно столкнетесь с тем, что довольно часто приходиться проделывать одни и те же операции над всеми серверами. Например: вносить изменения в конфигурационные файлы (/etc/hosts, скрипты инициализации и т.п.), или производить разовую архивацию на всех серверах. После очередной пресной порции обезьяньей работы мы понимаем, что это не linux-way. Что можно сделать?
Задача # 1
Для примера: нужно поправить /etc/hosts на локальном компьютере и 8 серверах, список которых в файле
Стандартный подход
Обычно для решения этой задачи используем стандартные инструменты: любимый редактор (vim или nano) и scp (http://ru.wikipedia.org/wiki/SCP), который входит в состав пакета openssh и включен во все современные дистрибутивы.
1. Вносим необходимые правки в /etc/hosts.
2. Копируем на каждый из серверов:
3. Вводим пароль.
4. Опять выполняем команду копирования:
5. И снова вводим пароль.
.
17. И последний раз вводим пароль.
То есть выполняем 17 нудных действий. Пришло время подняться на первую ступень просвещения.
Ускоренный стандартный подход
Для начали избавимся от необходимости ввода пароля при входе по ssh или выполнения копирования посредством scp. Для этого мы сгенерируем пару ключей на локальной машине:
Несколько раз нажимаем Enter на все задаваемые вопросы. А затем скопируем этот ключ на все сервера стандартной командой ssh-copy-id, попутно вводя пароль. Можно копировать по одному:
1. Копируем ключ сначала на одну машину:
2. Вводим пароль.
3. Копируем ключ на слеующую машину:
16. Последний пароль.
А лучше в ускоренном режиме:
1. Копируем ключи поочередно на каждую из машин, список которых в файле
2. Вводим пароль.
3. Следующий пароль.
.
8. Последний пароль.
Все!
Это и правда все, то есть всего 2 (два) действия. Этой конструкцией можно горы свернуть, но не все, к сожалению. Например, мы сможем выполнить любую команду для каждого из серверов, но мы не увидим вывода этой команды. Можем смириться или двигаться на следующую ступень просветления.
Задача # 2
Нам просто нужно узнать время работы с последней перезагрузки стандартной командой uptime, но со всех серверов. Для этого нам придется воспользоваться одной из программ для параллельного выполнения комманд.
Программы для параллельного выполнения команд
Так как проблема существует не первый день, решений придумана масса, с довольно различными реализациями и подходом :
Из них бы я особо выделил pssh, pdsh, shmux. А из этих трех мне приглянулся pdsh, за то что: написан на С, давно разрабатывается, часто обновляется, и есть в репозиториях практически всех современных систем (кроме Slackware). И самое главное — не требуется установка на сервера, только на машине, откуда будете работать.
PDSH — высокопроизводительная, распараллеленная оболочка (по крайней мере так говорится на официальном сайте. Для доступа к серверам использует либо rsh, либо ssh, что предпочтительней. А так же использует модули расширения, которых мы касаться не будем. Установка, думаю, проблем не вызовет:
Синтаксис программы прост:
Решаем задачу # 2, а по ходу разбираемся:
Вот и все, задача решена. Правда вывод мы получили вразнобой, так как задачи выполняются параллельно, и вывод происходит по мере поступления (в shmux проблема решена). Но сама команда выглядит монструозной, не правда ли? Для решения этой проблемы у pdsh есть свой синтаксис, который отличается от синтаксиса bash из примера, думаю, будет понятно:
Получилось немного короче. А когда серверов 50, разница будет потрясающая.
Если мы хотим выполнить некий скрипт на всех серверах содержащий спецсимволы «; & && | || » обязательно возьмите всю выполняемую команду в кавычки. В противном случае интерпретатор (bash) решит, что команда, выполняемая после спецсимвола, предназначена для локальной машины. Например:
Интересно, что сделает скрипт, если мы кавычки забудем?
В комплекте с pdsh есть утилита pdcp схожая по функционалу с scp. Решим с ее помощью задачу # 1:
1. Редактируем /etc/hosts
2. Копируем все файлы hosts на удаленные машины в папку /etc:
Просто, да? Единственная трудность в том, что для этого pdsh должен быть установлен на всех машинах, но ведь теперь это не проблема:
А можно все это еще ускорить или упростить? Можно и нужно, последняя ступень просвещения и выход на космические скорости.
Редактируем .bashrc
Если мы управляем несколькими группами серверов, например хостинговыми (50шт) с Debian, сервера внутреннего проекта (24шт) со Slackware и офисные сервера (10шт) c Fedora. Тогда было бы удобно разделить их на группы. У pdsh на этот счет есть решение, но заставить его работать на Slackware я так и не сумел. Поэтому я пошел по linux-way и добавил в
/.bashrc вот такие строки:
Это позволило нам разделить сервера на группы, а так же обеспечило возможность автодополнения по табуляции. Для примера установим htop на всех машинах:
И, собственно, все. А если мы захотим узнать uptime на всех серверах, выполним следующее:
Что бы отчистить все сервера от бэкап-файлов, которые остаются после редактирования vim’ом, поступим так:
Думаю, нет необходимости подсчитывать количество сэкономленных телодвижений.
Итого
Если у вас до 10 нетребовательных к вниманию серверов, имеет смысл использовать ssh c аутентификацией по ключам и «ускоряющую конструкцию». Если более, то pdsh, pssh или shmux, дополненных .bashrc.
Источник
PDSH: Параллельное выполнение команд на нескольких Linux-серверах
В данной статье я расскажу вам, как управлять большим парком Linux серверов из консоли одного сервера, выполнять удаленно команды на других серверах и получать их результаты, проверять состояние серверов и выполнять параллельно однотипные работы с помощью утилиты pdsh. Разберемся в ее установке, настройке и параллельном запуске команд на нескольких серверах.
PDSH (parallel distributed shell) — высокопроизводительная утилита для параллельного запуска команд на большом количестве Linux-серверов через ssh. По умолчанию pdsh позволяет поддерживать 32 параллельных соединения с управляемыми северами. Для pdsh есть несколько полезных модулей расширения, которые мы также рассмотрим в этой статье.
С помощью pdsh вы можете:
- Обновлять ПО на серверах;
- Установить необходимые модули или утилиты;
- Запустить какой-то bash скрипт;
- Проверить наличие обновлений и многое другое.
Установка PDSH и дополнительных модулей
Сначала нужно установить утилиту pdsh и нужные модули. В CentOS установка выполняется через менеджер пакетов yum:
yum install epel-release -y – подключаем репозиторий Epel
yum install pdsh pdsh-mod-genders -y — устанавливаем pdsh и модуль genders для него.
В целом для настройки 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
Ключ добавлен, нужно проверить проходит ли соединение с pdsh-сервера:
Примеры использования pdsh для запуска команд на множестве серверов
Так как ряд серверов может отличаться по hostname , я для себя сделал такую схему настройки PDSH. В файл hosts на управляющем сервере с pdsh я добавляю каждый управляемый сервер и присваиваю ему удобное мне имя, например:
Где вместо звездочек нужно указать IP destination-серверов.
Чтобы pdsh мог подключиться на заданные имена серверов, в файле /root/ssh/known_hosts к ключу каждого управляемого сервера, через запятую нужно добавить желаемое имя сервера, которое мы указали в /etc/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 server1 ‘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 -w server16 ‘uptime’ | sort -n
Рассмотрим ранее установленный модуль pdsh-mod-gendors. Чтобы воспользоваться им, создадим сам файл:
Для чего же он нужен? Genders – это файл с собственным синтаксисом для описания ролей pdsh. Как его можно применить в работе? Например:
- У вас есть 10 серверов с Ubuntu. Мы объединим их в одну группу Ubuntu, пусть их хостнеймы будут ubuntu1-10.
В файл /etc/genders прописываем следующие строки:
Т.е. в файле /etc/genders вы можете создать различные группы Linux серверов. Чтобы pdsh читал данные из файла genders при запуске вместо ключа –w нужно указывать –g.
В моем случае сервера по-прежнему два, но это ничего не меняет:
[root@server etc]# pdsh -g centos ‘date’
Так гораздо удобнее и команда выполняется на всех серверах в группе.
По умолчанию 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 _http://mirror.yandex.ru/centos/7.7.1908/isos/x86_64/CentOS-7-x86_64-Minimal-1908.iso’
Хотите быстро проверить какие репозитории установлены на управляемых серверах?
pdsh -w server[1,2] ‘yum repolist’
pdsh -w server[1,2] ‘yum install httpd -y’ – установка apache на оба сервера
И проверим установилось ли действительно:
То есть, можно выполнить какую угодно команду сразу на нескольких удаленных серверах. Если вы хотите запустить какой-то скрипт bash, я бы советовал добавить его в какой-то файл и скопировать на нужные сервера, после чего произвести его запуск.
На этом, пожалуй, все, надеюсь информация будет для вас полезной и облегчит рутинные задачи управления множеством серверов Linux.
Источник
Как запустить одновременно несколько команд в Linux
Главное меню » Операционная система Linux » Как запустить одновременно несколько команд в Linux
Как запустить несколько команд в Linux в одно и тоже время?
Есть несколько операторов, доступных для запуска несколько команд в Linux в одно и тоже время, такие как «точка с запятой или ;», оператор «логический AND» и оператор «логический OR».
Используйте оператор точку с запятой «;»
Оператор точка с запятой или «;» позволяет запускать несколько команд одновременно в Linux, когда команда отделяются символом «;».
Базовый синтаксис для оператора с запятой:
Не имеет значения, если предыдущая команда успешно или нет. Даже в случае выхода из строя одной команды, следующая команда будет выполнена. Это очень удобно в сценариях оболочки.
Использование логического оператора «&&»
Иногда нам нужно выполнить вторую команду, только если первая команда успешно завершена в отличие от оператора точка с запятой.
Базовый синтаксис логического оператора:
Пример логического оператора.
В приведенном выше примере мы создали папку или каталог с именем «data» в разделе каталога «/tmp». Так как мы успешно создали каталог /tmp/data, мы можем в состоянии перейдите в каталог «/tmp/data».
Для того, чтобы перепроверить это условие, выполните одну и ту же команду еще раз, как показано ниже:
В приведенном выше вывода команды «mkdir /tmp/data» не удалась, так как уже существует. Система не позволяет запускать вторую команду.
Оператор логический AND рекомендуется над оператором точкой с запятой, так как это проверит состояние успеха или неудач предыдущей команды. Чтобы объяснить это, давайте рассмотрим пример.
- Перейдите в директорию /tmp/data1
- Удалите все файлы в нем.
Здесь, в приведенных выше примере выполнение команды “cd /tmp/data1;rm -rf *” параллельно привело к катастрофе, так как на системном каталоге /tmp/ data1 не существует, и поэтому вместо того, чтобы удалять файлы в /tmp/ data1/, будут удалены все наши файлы в текущем рабочем каталоге, которые находятся в /tmp/data. Чтобы избежать такой ситуации используйте ниже команды с логическим оператором “cd /tmp/data1 && rm -rf *”.
Здесь вторая команда не удалось, так как первая команда тоже не удалось.
Использование логического оператора OR «||»
В некоторых других случаях мы должны выполнить вторую команду, только если первая команда вышла неудачной. Чтобы справиться с этим делом мы используем логический оператор OR.
Основной синтаксис для логического оператора OR:
Пример логического оператора OR.
Здесь мы только создали каталог «/tmp/data1″ во второй команде, только если она не существует, которая проверяется в первой команде»[-d /tmp/ data1]».
Объединение нескольких оператор для выполнения нескольких команд в Linux
Мы можем также объединить несколько операторов для запуска нескольких команд в Linux.
В приведенной выше команде мы использовали несколько операторов. В случае, если файл существует, мы получим сообщение, наподобие этого «успешно открыл файл» иначе мы получим сообщение об ошибке «Не удалось открыть файл». Так мы можем объединить несколько операторов в один раз, чтобы запустить несколько команд в Linux.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник