В данной статье я расскажу вам, как управлять большим парком Linux серверов из консоли одного сервера, выполнять удаленно команды на других серверах и получать их результаты, проверять состояние серверов и выполнять параллельно однотипные работы с помощью утилиты pdsh . Разберемся в ее установке, настройке и параллельном запуске команд на нескольких серверах.
PDSH (parallel distributed shell) — высокопроизводительная утилита для параллельного запуска команд на большом количестве Linux-серверов через ssh. По умолчанию pdsh позволяет поддерживать 32 параллельных соединения с управляемыми северами. Для pdsh есть несколько полезных модулей расширения, которые мы также рассмотрим в этой статье.
С помощью pdsh вы можете:
Сначала нужно установить утилиту pdsh и нужные модули. В CentOS установка выполняется через менеджер пакетов yum :
yum install epel-release -y
– подключаем репозиторий Epel
yum install pdsh pdsh-mod-genders -y
— устанавливаем pdsh и модуль genders для него.
В целом для настройки pdsh больше ничего и не нужно. Мы установили сам pdsh, а так же установили дополнительный модуль pdsh-mod-genders , о котором я расскажу чуть позже, когда мы перейдем к запуску команд на удаленных серверах.
Чтобы не вводить каждый раз пароли для подключения к удаленным серверам, мы выполним генерацию ключа ssh на сервере управления с установленным pdsh и добавим его на управляемые сервера.
ssh-keygen -q
Enter file in which to save the key (/root/.ssh/id_rsa):_x000D_Enter passphrase (empty for no passphrase):_x000D_Enter same passphrase again:_x000D_
Запустив команду ssh-keygen -q
на все вопросы просто жмем Enter. Ключ готов, теперь осталось скопировать его на управляемые Linux-сервера. В качестве примера я взял 2 сервера с Linux CentOS.
На управляемых серверах создайте директорию для ssh ключа (если таковой нет):
mkdir /root/.ssh/
Скопируем ключ в данный каталог, я это делаю через echo:
echo -e "ваш ключ с файла /root/.ssh/id_rsa.pub" >> /root/.ssh/authorized_keys
Ключ добавлен, нужно проверить проходит ли соединение с pdsh-сервера:
ssh server1
Все в порядке.
Так как ряд серверов может отличаться по hostname , я для себя сделал такую схему настройки PDSH. В файл hosts на управляющем сервере с pdsh я добавляю каждый управляемый сервер и присваиваю ему удобное мне имя, например:
cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4_x000D_::1 localhost localhost.localdomain localhost6 localhost6.localdomain6_x000D_*.*.*.* server1_x000D_*.*.*.* server2_x000D_
Где вместо звездочек нужно указать IP destination-серверов.
Чтобы pdsh мог подключиться на заданные имена серверов, в файле /root/ssh/known_hosts к ключу каждого управляемого сервера, через запятую нужно добавить желаемое имя сервера, которое мы указали в /etc/hosts. Например:
После этого вы сможете подключаться по тому hostname, которое выбрали для удобства, это нам пригодится, если у нас будет 100500 серверов, которые именуются вразнобой.
Для запуска команды на удаленном сервере через pdsh используется такой конструкция:
pdsh -w server1 'команда'
— я всегда советую брать в кавычки запускаемые команды, так как если вы будете использовать спецсимволы, bash на сервере с pdsh выполнит команду после спецсимвола локально.
Например, чтобы узнать время на удаленных серверах, можно выполнить команду для каждого из них.
pdsh -w server1 'date'
server1: Sat Sep 14 12:27:16 +06 2019
pdsh -w server2 'date'
server2: Sat Sep 14 12:27:21 +06 2019
Или выполнить одну команду сразу для списка серверов:
pdsh -w server1,server2 'date'
server1: Sat Sep 14 12:36:20 +06 2019_x000D_server2: Sat Sep 14 12:36:20 +06 2019
Если нужно выполнить команду на 10-ти серверах, получится довольно длинная команда с перечислением всех серверов, что неудобно. Т.к. мы задали собственные hostname для серверов, и pdsh это понимает, при вызове pdsh можно укажите конкретные сервера или диапазон серверов в квадратных скобках:
pdsh -w server[1-2] 'date'
— диапазон серверов в моем случае 2 сервера. Может быть от 1 до 20, выглядеть будет так: pdsh -w server[1-20] 'date'
pdsh -w server[1,2] 'date'
— конкретные сервера 1 и 2, можно выбрать например 3-4 сервера и команды будет выглядеть следующим образом: pdsh -w server[1,2,7,9] 'date'
Для более удобного форматирования вывод результатов команд с удаленных серверов можно использовать конструкцию:
pdsh -w server[1-20] ‘uptime’ | sort -n
Рассмотрим ранее установленный модуль pdsh-mod-gendors . Чтобы воспользоваться им, создадим сам файл:
touch /etc/genders
Для чего же он нужен? Genders – это файл с собственным синтаксисом для описания ролей pdsh. Как его можно применить в работе? Например:
ubuntu[1-10] ubuntu
centos[1-10] centos
web[1-10] web
sys[1-5] our_x000D_adm[4-8] our_x000D_
Т.е. в файле /etc/genders вы можете создать различные группы Linux серверов. Чтобы pdsh читал данные из файла genders при запуске вместо ключа –w нужно указывать –g .
В моем случае сервера по-прежнему два, но это ничего не меняет:
[root@server etc]# pdsh -g centos 'date'
server1: Sat Sep 14 12:49:59 +06 2019_x000D_server2: Sat Sep 14 12:50:00 +06 2019_x000D_
Так гораздо удобнее и команда выполняется на всех серверах в группе.
По умолчанию 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'
server2: Loaded plugins: fastestmirror_x000D_server2: Loading mirror speeds from cached hostfile_x000D_server2: * base: repo.centos.ru_x000D_server2: * extras: repo.centos.ru_x000D_server2: * updates: repo.centos.ru_x000D_server2: repo id repo name status_x000D_server2: base/7/x86_64 CentOS-7 - Base 10,019_x000D_server2: extras/7/x86_64 CentOS-7 - Extras 435_x000D_server2: updates/7/x86_64 CentOS-7 - Updates 2,500_x000D_server2: repolist: 12,954_x000D_server1: Loaded plugins: fastestmirror_x000D_server1: Loading mirror speeds from cached hostfile_x000D_server1: * base: repo.centos.ru_x000D_server1: * extras: repo.centos.ru_x000D_server1: * updates: repo.centos.ru_x000D_server1: repo id repo name status_x000D_server1: base/7/x86_64 CentOS-7 - Base 10,019_x000D_server1: extras/7/x86_64 CentOS-7 - Extras 435_x000D_server1: updates/7/x86_64 CentOS-7 - Updates 2,500_x000D_server1: repolist: 12,954
pdsh -w server[1,2] 'yum install httpd -y'
– установка apache на оба сервера
И проверим установилось ли действительно:
То есть, можно выполнить какую угодно команду сразу на нескольких удаленных серверах. Если вы хотите запустить какой-то скрипт bash, я бы советовал добавить его в какой-то файл и скопировать на нужные сервера, после чего произвести его запуск.
На этом, пожалуй, все, надеюсь информация будет для вас полезной и облегчит рутинные задачи управления множеством серверов Linux.
Если говорить о том, какие лучшие дистрибутивы Linux мы знаем, то этот список может быть…
Хотя Ubuntu и поставляется со встроенным обозревателем Firefox многие пользователи считают что это не самая…
Что такое Remmina? Remmina — это совершенно бесплатный и свободный клиент так называемого удаленного рабочего…
Как мы знаем, Ubuntu это самая популярная сборка из систем на базе ядра Linux. У…
Выбор ноутбука для каждого пользователя это довольно кропотливый процесс. Люди стараются подобрать ноутбук который будет…
Если вы решили ознакомиться с операционной системой Linux более детально и задались вопросом как установить…