Стаття також доступна російською (перейти до перегляду).

Вступ
- Існуючі підходи до віддаленого керування конфігураціями серверів
- Загальні відомості про Ansible
- Практичне використання Ansible
- Робота з командами Ansible
- Робота з Playbook
Задача автоматизації процесів керування конфігураціями віддалених серверів є найбільш затребуваною серед DevOps-фахівців. Це пов'язано із відсутністю єдиного підходу до її вирішення та складністю забезпечення надійного та швидкого керування великою кількістю різних типів серверів. Інструментарій, котрий пропонується, може стати найбільш вдалим рішенням для більш ніж 99 % випадків віддаленого адміністрування.
Існуючі підходи до віддаленого керування конфігураціями серверів
Можна виділити два принципово різні підходи, що до віддаленого керування машинами. Перший з них полягає у використанні імперативних методів керування, коли формується набір обов'язкових до виконання на клієнтських машинах директив, котрі задають детальний алгоритм реалізації задачі. Критерієм успішності виконання задачі тут є однаковий стан конфігурації кожної з машин групи серверів. Серед недоліків підходу можна вказати на складність програм, які задають конфігурацію клієнтів, а також неможливість забезпечення достатнього рівня надійності виконання через складність дотримання умов критерію успішності – забезпечення однакових станів конфігурацій. Серед найбільш відомих реалізацій вказаного підходу – використання bash-скриптів для формування директив, визначаючих конфігурації клієнтів.
Другий підхід спирається на декларативні методи керування конфігураціями, коли в управляючій програмі описується лише результат виконання задачі без алгоритму її реалізації, тобто, фактично вона є специфікацією майбутньої конфігурації. Реалізація такої управляючої програми є вже завданням конкретних клієнтських машин зі своїм програмно-апаратним наповненням. Це є відображенням відомої у світі концепції IaC (Infrastructure as Code), котра розглядає розгалужену інфраструктуру серверів у вигляді коду, котрий визначає ідемпотентні зміни у її стані. Такий підхід забезпечує стовідсоткову надійність виконання задачі в незалежності від попереднього стану конфігурації системи будь-якої з машин групи серверів. Скільки б разів програма не запускалась, результат буде той же. Це є більш перспективний підхід і тому існує досить багато його реалізацій.
Сутність однієї з реалізацій декларативного підходу полягає в використанні предметно-орієнтованої мови розмітки для формування управляючих програм – специфікацій задач – та їх подальшу передачу на клієнтські машини для обробки заздалегідь встановленим та налаштованим спеціальним програмним забезпеченням (ПЗ). Недоліком тут є складність підготовки клієнтського ПЗ, хоча надійність та якість достатньо високі. Найбільш відомими прикладами є Puppet та Chef.
В іншій реалізації декларативного підходу також використовується декларативна мова розмітки для опису конфігурацій клієнтів, однак, тут не потрібна наявність додаткового клієнтського ПЗ для формування заданої конфігурації. Її формування відбувається за рахунок використання захищеного каналу, утвореного протоколом ssh та можливостями мови Python, встановленої на всіх клієнтських машинах. Тобто, управління запуском модулів з описом конфігурації вузлів відбувається за допомогою push-повідомлень каналу ssh, а їх виконання здійснюється мовою Python. Тому метод отримав назву «push-based», тобто, той, що базується на push-повідомленнях. Прикладом є SaltStack. Певним недоліком тут є велика кількість додаткових сервісів, котрі ускладнюють її використання.
Альтернативою SaltStack є використання більш спрощеної програми Ansible, яка дозволяє виконувати ті ж задачі, що і вказаний сервіс, однак є більш простою у використанні. Розглянемо її більш детально.
Загальні відомості про Ansible
Як зазначалося, Ansible спирається на декларативний підхід та використовує push-повідомлення для керування віддаленими машинами. У якості мови розмітки тут використовується YAML (Yet Another Markup Language), котрий орієнтований на опис типових структур даних і є більш простим у використанні порівняно із XML (eXtensible Markup Language).
З метою абстрагування від менш значущих речей, можна виділити три основні компоненти інфраструктури під керуванням Ansible:
- Управляючий вузол;
- Керовані вузли або клієнти;
- Список хостів або inventory в термінології Ansible.
Управляючий вузол може бути розміщений як на локальному комп’ютері, так і на віддаленому сервері. Для його функціонування достатньо встановити відповідне ПЗ. Всі визначення конфігурацій клієнтів зберігаються тут. Ansible може бути встановлений на комп'ютер із операційною системою (ОС) на базі Linux. ОС Windows не підтримується в якості вузла керування Ansible, однак, можливо встановити його на ОС Windows 10 на підсистему WSL (Windows Subsystem for Linux). При цьому будуть діяти деякі обмеження по функціональності програми, тому її краще використовувати лише для навчання та ознайомлення. Серед інших вимог потрібна наявність Python 2 версії 2.7 або Python 3 версії 3.5 або вище. Також необхідна наявність встановленого протоколу ssh.
Конфігурація програмного середовища вузла може бути заданою за допомогою файлу /etc/ansible/ansible.cfg. Інші файли ansible.cfg можуть бути розміщені у поточному каталозі проекту або у домашній директорії користувача. При цьому найвищий пріоритет буде мати файл поточної директорії проекту.
Керовані вузли можуть включати від одного до нескінченої кількості машин (існують лише технічні обмеження), на котрих сконфігуровано сервер ssh та встановлений Python відповідної версії. Цього цілком достатньо для можливості управління клієнтом з керуючого вузла.
Список хостів є переліком IP-адрес керованих вузлів з обліковою інформацією, котрий зазвичай знаходиться у файлі /etc/ansible/hosts.
Практичне використання Ansible
Підготовка до роботи з Ansible полягає у виконанні кількох кроків. Це розгортання управляючого вузла на сервері, формування списку керованих вузлів з додаванням облікової інформації по кожному з них, налаштування конфігурації системи та її тестування. Розглянемо ці кроки більш детально.
Розгортання
Розгортати управляючий вузол будемо на сервері під керуванням ОС Ubuntu 20.04. Відповідно до вимог, що до необхідного ПЗ, перевіримо наявну версію мови Python. Для цього наберемо в терміналі:
$ python3 --version

Встановлена версія Python 3.8 цілком відповідає встановленим вимогам.
Після цього включимо PPA (Personal Package Archive) в список джерел для нашої системи за допомогою наступної команди:
$ sudo apt-add-repository ppa:ansible/ansible

Після підтвердження згоди процес підключення продовжиться :

Тепер оновимо індекс пакетів системи, щоб стали доступними нові пакети. Для цього введемо у терміналі:
$ sudo apt update

Розпочнемо процес інсталяції програми за допомогою наступної команди:
$ sudo apt install ansible

Необхідний додатковий обсяг дискового простору для програми становить 324 MB. Після підтвердження нашої згоди на його виділення процес інсталяції продовжиться.

Кінцевий екран виводу програми інсталяції виглядає наступним чином:

Переконаємося, що програма встановлена та з'ясуємо назви та місцезнаходження її основних компонентів. Для цього введемо у терміналі:
$ ansible –version

Як можна переконатися, програма Ansible була успішно встановлена та визначені локації її основних модулів.
Формування списку керованих вузлів
Список віддалених клієнтів формується у файлі /etc/ansible/hosts із введенням необхідної облікової інформації для можливості автоматичного під'єднання до вузлів по ssh. Цей шлях до файлу hosts зі списком хостів встановлюється програмою за замовчуванням. Однак, місцезнаходження файлу може бути і іншим в залежності від потреб проекту. Це треба враховувати при запуску команд Ansible, про що буде сказано нижче. Відкриємо файл у редакторі:
$ sudo nano /etc/ansible/hosts


У файлі, що відкрився, створимо групу webservers, у котрій пропишемо імена хостів, IP-адреси та облікові дані для кожного з хостів. У нашому випадку, під'єднання до хоста server1 буде відбуватися по паролю, а до хоста server2 – з використанням ключів ssh. Тут ми вказали шлях доступу до місцезнаходження файлу секретного ключа для server2. Це необхідно у випадку, якщо віддалений хост затребує підтвердження наявності вказаного ключа на управляючому вузлі. Відкритий або публічний ключ у цей час повинен знаходитися на server2 у спеціальному файлі облікового запису користувача, котру ми використовуємо для входу. Адреса цього файлу: ~/.ssh/authorized_keys.
У розділі all:vars ми вказали загальні для всіх груп хостів параметри – логін користувача для входу (alexandr75001) та вказівка на використання Python3.
Збережемо введену у файл інформацію (Ctrl+O) та вийдемо із редактору (Ctrl+X).
Тепер виведемо список доступних для Ansible керованих вузлів і водночас переконаємося що програма вірно ідентифікувала введену нами інформацію по клієнтським вузлам. Для цього введемо наступну команду:
$ ansible-inventory --list -y

По результатам виводу команди можна переконатися, що всі наші групи і вузли програмою ідентифіковані вірно.
Налаштування конфігурації системи
Як вже зазначалося, програмне середовище управляючого вузла налаштовується за допомогою файлів конфігурації, котрі можуть розташовуватися на різних рівнях. Наведемо приклад налаштування файлу конфігурації, розташованого на найнижчому рівні. Для цього введемо у терміналі:
$ nano /etc/ansible/ansible.cfg


У файлі, що відкрився, у коментарях можна подивитися приклади його заповнення. Додамо в нього інформацію по трьом розділам – defaults, ssh_connection та diff. Встановлені параметри дозволяють регулювати автоматичний процес з'єднання по протоколу ssh та змінювати значення стандартних налаштувань, наприклад, що до місцезнаходження файлу логів програми, видачі системних повідомлень та багатьох інших. Збережемо зміни та вийдемо із редактору (Ctrl+O, Ctrl+X).
Тестування
Сутність тестування полягає у з'ясуванні ситуації, що до доступності керованих вузлів, достовірності їх облікових даних для з'єднання по протоколу ssh та можливість запуску на вузлах модулів Ansible за допомогою встановленого на них Python. Для цього Ansible має влаштований модуль ping, котрий може бути запущений на керуючому вузлі із різним набором параметрів. Зокрема, там можна вказати логін користувача вузлів, якщо він не вказаний у файлі hosts. Для прикладу, протестуємо керовані вузли нашого проекту, запустивши відповідний модуль Ansible:
$ ansible all –m ping

Проаналізуємо результат. За повідомленнями обидва хости недоступні і це зрозуміло, оскільки вони дійсно недоступні в мережі. Разом з тим, команда вірно визначила всі дані наших налаштувань – імена хостів, відповідні IP-адреси та порти, що говорить про те, що управляючий вузол сконфігуровано вірно. У випадку доступності вузлів, по кожному з них повинна б була бути відповідь, на кшталт наступної:
server | SUCCESS => {
"changed": false,
"ping": "pong"
}
Саме ця відповідь говорила б про повну готовність усієї розгалуженої інфраструктури вузлів до роботи.
Робота з командами Ansible
Після перевірки працездатності усієї інфраструктури можна керувати вузлами за допомогою команд Ansible. Всі ці команди починаються із ключового слова ansible та можуть мати досить значний набір параметрів. Наприклад, можна керувати таким чином як усією групою клієнтів, так і обраними машинами, навіть, однією.
Наприклад, для того, щоб вивести інформацію по всім групам керованих вузлів про типи файлових систем дискових пристроїв та їх завантаженість, використовується наступний формат відповідної команди Ansible:
$ ansible all -a "df -h"
Та сама команда, але лише для вузлів нашої групи webservers буде виглядати наступним чином:
$ ansible webservers -a "df -h"
Для одного вузла тієї ж групи:
$ ansible server1 -a "df -h"
Також можливо перераховувати потрібні вузли прямо у команді:
$ ansible server1:server2 -a "df -h"
Замість команди «df –h» може бути використана будь-яка інша, але принцип керування вузлами залишається той самий.
Як зазначалося вище, при запуску команд Ansible необхідно враховувати місцезнаходження файлу hosts зі списком керованих вузлів. Для цього треба використовувати параметр –i. Для прикладу, вкажемо у команді на місцезнаходження файлу hosts у іншому місці:
$ ansible webservers -a "df -h" –i /etc/mmm/hosts
Робота з Playbook
В термінології Ansible playbook це файл у форматі yml зі списком задач для керованих вузлів. Замість того, щоб набирати кожну команду у терміналі, краще сформувати список команд у одному файлі, а потім однією командою запустити його на виконання для всіх вузлів. Таким чином, отримуємо подвійну автоматизацію процесу керування віддаленими вузлами. Команди формуються за допомогою декларацій мови розмітки YAML, про що вже йшлося тут раніше.
Код в playbook є чітко структурованим. Він розбитий на кілька розділів, в кожному з яких описуються певні області даних. Наведемо назви цих розділів та їх призначення:
hosts – вказуються назви вузлів, котрі прописані у загальному списку.
become – прописується рівень привілей користувача, від імені котрого запускається playbook.
vars – визначення користувацьких змінних.
tasks – список команд для виконання.
Для прикладу, наведемо код реального playbook, котрий містить інформацію з нашого файлу hosts:
hosts: webservers
become: 'yes'
vars:
user:
- name: "alexandr75001"
password: "aGRJt3gaOb"
ssh_key: "ssh-rsa ..."
packages:
- htop
- wget
- curl
tasks: [...]
Наведений вище код після запуску призведе до встановлення вказаних у коді пакетів htop, wget та curl на всіх вузлах нашої групи webservers. Значення yes у розділі become говорить про те, що playbook буде запущено від імені користувача з правами sudo. У розділі tasks можуть бути і інші задачі, котрі також були б виконані. Нижче наведена структура вказаного розділу:
tasks:
- name: Task name
user: [...]
loop: [...]
У підрозділі name прописується скорочений опис нашої задачі для само документування playbook.
Модуль user запускається на виконання та налаштовується цією задачею. Він є об'єктом, інкапсулюючим потрібний стан конфігурації. Такі модулі можуть керувати системними ресурсами та будь-якими службами.
Модуль loop є циклом по змінним. Він дає можливість організувати автоматичне повторення виконання задачі будь-яку кількість разів з різними вхідними даними. Для цього достатньо запустити playbook лише раз.
Дата-центр FREEhost.UA пропонує послуги оренди виділених та віртуальних серверів за найвигіднішими цінами в Україні. Гарантія доступності обладнання 99,99%, цілодобова технічна підтримка, резервне електроживлення. Запрошуємо Вас скористатися нашими послугами.
Підписуйтесь на наш телеграм–канал https://t.me/freehostua, щоб бути в курсі нових корисних матеріалів.
Дивіться наш канал Youtube на https://www.youtube.com/freehostua.
Ми у чомусь помилилися, чи щось пропустили?
Напишіть Про це у коментарях, ми з задоволенням відповімо та обговорюємо Ваші зауваження та пропозиції.
|
Дата: 10.01.2023 Автор: Евгений
|
|

Авторам статті важлива Ваша думка. Будемо раді його обговорити з Вами:
comments powered by Disqus