У даній статті я розповім вам, як управляти великим парком 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. Як його можна застосувати в роботі? наприклад:
- У вас є 10 серверів з Ubuntu. Ми об'єднаємо їх в одну групу Ubuntu, нехай їх хостнейми будуть ubuntu1-10.
У файл / etc / genders прописуємо наступні рядки:ubuntu [1-10] ubuntu
- У вас є 10 серверів з Centos і аналогічні хостнейми - centos1-10:
centos [1-10] centos
- Так само є група серверів для розробників - web1-10:
web [1-10] web
- Якщо є група серверів з різними іменами, наприклад 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.