PDSH Паралельне виконання команд на декількох Linux-серверах

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

PDSH (parallel distributed shell) - високопродуктивна утиліта для паралельного запуску команд на великій кількості Linux-серверів через ssh. За замовчуванням pdsh дозволяє підтримувати 32 паралельних з'єднання з керованими півночі. Для pdsh є кілька корисних модулів розширення, які ми також розглянемо в цій статті.

За допомогою pdsh ви можете:

  • Оновлювати ПО на серверах;
  • Встановити необхідні модулі або утиліти;
  • Запустити якийсь bash скрипт;
  • Перевірити наявність оновлень і багато іншого.

зміст:

  • Установка PDSH і додаткових модулів
  • Налаштування сервера управління pdsh і керованих Linux-серверів.
  • Приклади використання 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, про який я розповім трохи пізніше, коли ми перейдемо до запуску команд на віддалених серверах.

Налаштування сервера управління 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

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

ssh server1

Все гаразд.

Приклади використання 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. наприклад:

Після цього ви зможете підключатися по тому 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 -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] і adm [4-8]:
    sys [1-5] our adm [4-8] our 

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

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

[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

Так само можна застосовувати ключі -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 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 на обидва сервера

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

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

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