У даній статті я розповім вам, як управляти великим парком Linux серверів з консолі одного сервера, виконувати віддалено команди на інших серверах і отримувати їх результати, перевіряти стан серверів і виконувати паралельно однотипні роботи за допомогою утиліти pdsh. Розберемося в її установці, налаштуванні і паралельному запуску команд на декількох серверах.

PDSH (паралельно розподілена оболонка) – високопродуктивна утиліта для паралельного запуску команд на великій кількості 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 в linux centos

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

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

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

ssh-keygen -q

Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

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

На керованих серверах створіть директорію для ssh ключа (якщо такої немає):

mkdir /root/.ssh/

Скопіюємо ключ в даний каталог, я це роблю через echo:

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

ssh ключі

Ключ доданий, потрібно перевірити чи проходить з’єднання з pdsh-сервера:

ssh server1

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

Все гаразд.

Приклади використання pdsh для запуску команд на безлічі серверів

Так як ряд серверів може відрізнятися по hostname, я для себе зробив таку схему настройки PDSH. У файл hosts на керуючому сервері з pdsh я додаю кожен керований сервер і привласнюю йому зручне мені ім’я, наприклад:

cat /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
*.*.*.* server1
*.*.*.* server2

Де замість зірочок потрібно вказати 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'

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
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

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

pdsh -w server[1-20] ‘uptime’ | sort -n

Розглянемо раніше встановлений модуль pdsh-mod-gendors. Щоб скористатися ним, створимо сам файл:

touch /etc/genders

Для чого ж він потрібен? Genders – це файл з власним синтаксисом для опису ролей pdsh. Як його можна застосувати в роботі? наприклад:

  1. У вас є 10 серверів з Ubuntu. Ми об’єднаємо їх в одну групу Ubuntu, нехай їх хостнейми будуть ubuntu1-10.
    У файл / etc / genders прописуємо наступні рядки:
    ubuntu[1-10] ubuntu
  2. У вас є 10 серверів з Centos і аналогічні хостнейми – centos1-10:
    centos[1-10] centos
  3. Так само є група серверів для розробників – web1-10:
    web[1-10] web
  4. Якщо є група серверів з різними іменами, наприклад sys[1-5] та адм[4-8]:
    sys[1-5] our
adm[4-8] our

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

У моєму випадку сервера як і раніше два, але це нічого не змінює:

[root@server etc]# pdsh -g centos 'date'

server1: Sat Sep 14 12:49:59 +06 2019
server2: Sat Sep 14 12:50:00 +06 2019

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

На прикладі нашої команди це виглядає так:

pdsh -g ubuntu 'date' -f 1

Так само можна застосовувати ключі і -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 сервер[1,2] cd / root && wget iso

Хочете швидко перевірити будь репозиторії встановлені на керованих серверах?

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

server2: Loaded plugins: fastestmirror
server2: Loading mirror speeds from cached hostfile
server2: * base: repo.centos.ru
server2: * extras: repo.centos.ru
server2: * updates: repo.centos.ru
server2: repo id repo name status
server2: base/7/x86_64 CentOS-7 - Base 10,019
server2: extras/7/x86_64 CentOS-7 - Extras 435
server2: updates/7/x86_64 CentOS-7 - Updates 2,500
server2: repolist: 12,954
server1: Loaded plugins: fastestmirror
server1: Loading mirror speeds from cached hostfile
server1: * base: repo.centos.ru
server1: * extras: repo.centos.ru
server1: * updates: repo.centos.ru
server1: repo id repo name status
server1: base/7/x86_64 CentOS-7 - Base 10,019
server1: extras/7/x86_64 CentOS-7 - Extras 435
server1: updates/7/x86_64 CentOS-7 - Updates 2,500
server1: repolist: 12,954

pdsh -w server[1,2] 'yum install httpd -y' – установка apache на обидва сервера

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

І перевіримо встановилося чи дійсно:

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

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

На цьому, мабуть, все, сподіваюся інформація буде для вас корисною і полегшить рутинні завдання управління безліччю серверів Linux.

Leave a Reply

Your email address will not be published. Required fields are marked *