В данной статье я расскажу вам, как управлять большим парком 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.
Как менялся логотип Apple на протяжении многих лет. Логотип Apple — это не просто символ,…
Security Boot Fail при загрузке Acer — решение проблемы При загрузке ноутбука Acer с флешки,…
Ноутбук не включается — варианты решения Если при попытке включить ноутбук вы обнаруживаете, что он…
The AC power adapter wattage and type cannot be determined — причины и решение При…
Свистит или звенит блок питания компьютера — причины и решения Некоторые владельцы ПК могут обратить…
Мигает Caps Lock на ноутбуке HP — почему и что делать? При включении ноутбука HP…