Підручник Puppet для початківців: що таке Puppet і як ним користуватися?
Перш ніж вивчати Puppet, давайте розберемося:
Що таке керування конфігурацією?
Управління конфігурацією — це процес підтримки програмного забезпечення та комп’ютерних систем (наприклад, серверів, сховищ, мереж) у відомому, бажаному та узгодженому стані. Це також дозволяє отримати доступ до точного історичного запису стану системи для цілей управління проектами та аудиту.
Системні адміністратори здебільшого виконують повторювані завдання, такі як встановлення серверів, налаштування цих серверів тощо. Ці професіонали можуть автоматизувати це завдання, написавши сценарії.
Однак це складна робота, коли вони працюють над величезною інфраструктурою. Інструмент керування конфігураціями, такий як Puppet, був представлений для вирішення таких проблем.
Що таке маріонетка?
Ляльковий це інструмент керування системою для централізації та автоматизації процесу керування конфігурацією. Puppet також використовується як інструмент розгортання програмного забезпечення. Це програмне забезпечення для керування конфігурацією з відкритим вихідним кодом, яке широко використовується для конфігурації сервера, керування, розгортання та оркестровки різноманітних програм і служб у всій інфраструктурі організації.
Puppet спеціально розроблений для керування конфігурацією Linux і Windows системи. Він написаний на Ruby і використовує його унікальний Domain Sпецифічний Lмова (DSL) для опису конфігурації системи.
Які є версії маріонеток?
Puppet випускається в двох варіантах:
- Маріонетка з відкритим кодом: це базова версія інструменту керування конфігурацією Puppet, який також відомий як Open Source Puppet. Він доступний безпосередньо на веб-сайті Puppet і ліцензований під системою Apache 2.0.
- Лялькове підприємство: Комерційна версія, яка пропонує такі функції, як звітування про відповідність, оркестровка, контроль доступу на основі ролей, графічний інтерфейс користувача, API та інструменти командного рядка для ефективного керування вузлами.
Що вміє Маріонетка?
Наприклад, у вас є інфраструктура з приблизно 100 серверами. Як системний адміністратор, ваша роль полягає в тому, щоб усі ці сервери завжди були в актуальному стані та працювали з повною функціональністю.
Для цього ви можете використовувати Puppet, який дозволяє написати простий код, який можна автоматично розгортати на цих серверах. Це зменшує людські зусилля та робить процес розробки швидким та ефективним.
Лялька виконує такі функції:
- Puppet дозволяє визначати окремі конфігурації для кожного хоста.
- Інструмент дозволяє безперервно відстежувати сервери, щоб підтвердити, чи існує потрібна конфігурація чи ні, і чи вона не змінена. Якщо конфігурацію змінено, інструмент Puppet повернеться до попередньо визначеної конфігурації на хості.
- Він також забезпечує контроль над усією налаштованою системою, тому централізовані зміни вносяться автоматично.
- Він також використовується як інструмент розгортання, оскільки він автоматично розгортає програмне забезпечення в системі. Він реалізує інфраструктура як код, оскільки політики та конфігурації написані як код.
Маріонетка DSL і парадигми програмування
Перш ніж вивчати Puppet DSL, давайте розберемося з парадигмами програмування:
Парадигма програмування — це стиль, який ви використовуєте в комп’ютерному програмуванні.
Є чотири типи парадигм:
- Наказовий спосіб.
- Декларативний.
- Функціональний (який вважається підмножиною цієї декларативної парадигми)
- Об'єктно-орієнтований.
Ми зосередимося на імперативному та декларативному.
Імперативні парадигми
Ця парадигма програмування виражає логіку обчислення (Що робити) і описує його потік керування (Як робити)
приклад:
Припустімо, що ви їдете до свого офісу, ви замовляєте таксі та починаєте давати покрокові вказівки водієві, поки не дійдете до офісу. Вказівка на те, що і як робити, є імперативним стилем.
Декларативні парадигми
Ця парадигма програмування виражає логіку обчислення (Що робити) без опису його потоку керування (Як робити)
приклад:
Припустімо, ви їдете до свого офісу, замовляєте таксі Uber і вказуєте кінцевий пункт призначення (Офіс). Зазначення того, що робити, а не як робити, є декларативним стилем.
Парадигма | Що робити | Як зробити |
---|---|---|
імператив | Так | Так |
Декларативний | Так | Немає |
Puppet використовує декларативну парадигму програмування
Puppet використовує декларативний підхід програмування.
приклад: Створіть користувача в системі:
Це можна зробити за допомогою імперативного шаблону програмування за допомогою сценарію оболонки: тут ми визначаємо, як створити користувача та які команди використовувати на операційна система.
Однак це можна зробити за допомогою декларативного шаблону програмування лише з кількома рядками маріонеткового коду, маріонеткової доменно-специфічної мови (DSL), і все одно досягти того самого результату.
Моделі розгортання засобів управління конфігурацією
Є дві моделі розгортання для засоби керування конфігурацією :
- Модель розгортання на основі Push: ініціюється головним вузлом.
- Модель розгортання на основі залучення: ініціюється агентами.
Модель розгортання на основі Push
У цій моделі розгортання головний сервер передає конфігурації та програмне забезпечення окремим агентам. Після перевірки безпечного з’єднання майстер віддалено запускає команди на агентах. Наприклад, Неможливо і соляний стек.
Модель розгортання на основі залучення.
У цій моделі розгортання окремі сервери зв’язуються з головним сервером, перевіряють і встановлюють безпечне з’єднання, завантажують свої конфігурації та програмне забезпечення, а потім налаштовують себе відповідно — наприклад, Puppet і Chef.
Як працює Puppet?
Puppet базується на моделі розгортання Pull, де вузли агента регулярно перевіряються після кожного 1800 секунд з головним вузлом, щоб побачити, чи потрібно щось оновити в агенті. Якщо щось потрібно оновити, агент отримує необхідні маріонеткові коди від головного і виконує необхідні дії.
Пояснимо це на прикладі:
приклад: Майстер – налаштування агента:
Майстер
Машина на базі Linux із встановленим програмним забезпеченням Puppet master. Він відповідає за підтримку конфігурацій у вигляді маріонеткових кодів. Головним вузлом може бути лише Linux.
Агенти
Цільові машини, якими керує маріонетка з інстальованим на них програмним забезпеченням маріонеткового агента.
Агент можна налаштувати на будь-якій підтримуваній операційній системі, наприклад Linux або Windows or Solaris або Mac OS.
Зв'язок між майстром і агентом встановлюється за допомогою захищених сертифікатів.
Спілкування між Майстром і Агентом
Крок 1) Після встановлення з’єднання між агентом і головним агентом Puppet надсилає дані про свій стан на сервер Puppet master. Вони називаються фактами: ця інформація включає ім’я хоста, деталі ядра, IP-адресу, деталі імені файлу тощо…
Крок 2) Puppet Master використовує ці дані та складає список із конфігурацією, яка буде застосована до агента. Цей список налаштувань, які потрібно виконати на агенті, відомий як a Каталог Це можна змінити, наприклад встановлення пакетів, оновлення або видалення, створення файлової системи, створення або видалення користувача, перезавантаження сервера, зміни конфігурації IP тощо.
Крок 3) Агент використовує цей список конфігурації, щоб застосувати будь-які необхідні зміни конфігурації на вузлі.
Якщо в конфігурації немає відхилень, агент не вносить жодних змін у конфігурацію та залишає вузол працювати з тією самою конфігурацією.
Крок 4) Після того, як це буде зроблено, вузол звітує ляльковому майстру, вказуючи, що конфігурацію застосовано та завершено.
Лялькові блоки
Puppet забезпечує гнучкість інтеграції звітів зі сторонніми інструментами за допомогою Puppet API.
Існує чотири типи будівельних блоків маріонеток
- Ресурси
- Класи
- Маніфест
- Модулі
Ресурси маріонеток
Ресурси Puppet є будівельними блоками Puppet.
Ресурси - це вбудовані функції які запускаються на задній частині для виконання необхідних операцій у маріонетці.
Лялькові класи
Комбінацію різних ресурсів можна згрупувати в одну одиницю під назвою клас.
Ляльковий маніфест
Маніфест — це каталог, що містить маріонеткові файли DSL. Ці файли мають розширення .pp. Розширення .pp розшифровується як лялькова програма. Код ляльки складається з визначень або оголошень класів маріонеток.
Лялькові модулі
Модулі — це набір файлів і каталогів, таких як маніфести, визначення класів. Це одиниці для повторного використання та спільного використання в Puppet.
Наприклад, MySQL модуль для встановлення та налаштування MySQL або модуль Jenkins для керування Jenkins тощо.
Види ресурсів маріонеток
Загалом система складається з файлів, користувачів, служб, процесів, пакетів тощо. У Puppet це називається ресурсами. Ресурси є основними будівельними блоками в
Маріонетка. Всі операції над агентами-маріонетками виконуються за допомогою ресурсів маріонеток.
Ресурси маріонеток — це готові інструменти, які використовуються для виконання різноманітних завдань і операцій на будь-якій підтримуваній платформі. Ми можемо використовувати один маріонетний ресурс для виконання конкретного завдання або ми можемо використовувати кілька маріонеткових ресурсів разом для виконання складних розгортань конфігурацій програми.
Ресурси можуть бути різних типів. Ляльковий використовує ресурси та типи ресурсів щоб описати конфігурацію системи.
Існує три типи ресурсів:
- Основні або вбудовані типи ресурсів маріонетки.
- Типи ресурсів, визначені маріонеткою.
- Типи спеціальних ресурсів маріонетки.
Основні або вбудовані типи ресурсів маріонетки
Основні або вбудовані типи ресурсів — це попередньо створені типи ресурсів маріонеток, які постачаються разом із програмним забезпеченням маріонеток. Усі основні або вбудовані типи ресурсів Puppet написані та підтримуються командою Puppet.
Типи ресурсів, визначені маріонеткою
Визначені типи ресурсів — це спрощені типи ресурсів, написані декларативною мовою Puppet із використанням комбінації існуючих типів ресурсів.
Типи спеціальних ресурсів маріонетки
Спеціальні типи ресурсів — це повністю налаштовані типи ресурсів, написані на Ruby.
Давайте дізнаємось про типи ресурсів маріонеток…
У терміналі введіть таку команду, щоб відобразити список відповідних підкоманд Puppet:
Puppet --help
У нашому випадку нас цікавить підкоманда «ресурс», який ми будемо використовувати для пошуку інформації про вбудовані типи ресурсів маріонеток.
У терміналі введіть будь-яку з наведених нижче команд, щоб відобразити список дії пов’язаний із підкомандою маріонетки “ресурс":
Puppet help resource Puppet resource --help
У цьому випадку ми маємо ресурс як підкоманда і – види як дія.
Puppet має 49 вбудованих основних типів ресурсів.
У терміналі введіть таку команду, щоб відобразити список доступних типів вбудованих маріонеткових ресурсів:
puppet resource –types
Кожен тип підтримує список Атрибути. Ці атрибути надають детальний опис, який Puppet використовує для керування ресурсом.
Щоб дізнатися всі атрибути, пов’язані з типом ресурсу маріонетки, скористайтеся такою командою:
puppet describe <resource type name>
Параметри перелічуватимуть усі доступні атрибути для цього типу ресурсу.
маріонетка описати пакет
Початківцю важко зрозуміти та пов’язати багато файлів некерованого маріонеткового коду. Ось де нам потрібно певне групування, щоб об’єднати операції. Мета полягає в тому, щоб вирішити одну проблему, таку як усі операції, необхідні для налаштування ssh на сервері чи службі ntp, або повного веб-сервера чи сервера бази даних з нуля.
Що таке лялькові класи?
Лялькові класи – це набір лялькових ресурсів, об’єднаних як єдине ціле.
Puppet представив класи, щоб зробити структуру багаторазовою та організованою.
По-перше, нам потрібно визначити клас за допомогою синтаксису визначення класу; класи повинні бути унікальними і можуть бути оголошені тільки один раз з тим же іменем:
class <class-name> { <Resource declarations> }
приклад:
class ntpconfig { file { "/etc/ntp.conf": ensure=> "present", content=> "server 0.centos.pool.ntp.org iburst\n", } }
Поки що ми лише визначили клас, але ми його ніде не використовували. Це означає, що цей код, який ми написали, ніколи не буде виконано, якщо ми не оголосимо цей клас деінде.
Оголошення класу
Щоб використовувати визначений клас у коді, використовуйте включати keyword.
class ntpconfig { file { "/etc/ntp.conf": ensure=> "present", content=> "server 0.centos.pool.ntp.org iburst\n", } } include ntpconfig
Давайте розберемося в цьому на реальному сценарії.
Демо інсталяція NTP
По-перше, переконайтеся, що пакет NTP ще не присутній на сервері, наступна команда нічого не поверне, якщо telnet відсутній на сервері:
rpm -qa | grep -i ntp
Як ми бачимо, пакет NTP вже присутній на сервері. Давайте видалимо існуючий пакет NTP:
yum remove ntp
Після видалення пакета переконайтеся, що файл ntp.conf не існує:
ls -lrt /etc/ntp.conf
Переконайтеся, що служба ntp не існує, виконавши таку команду:
systemctl status ntp
Створіть новий файл .pp, щоб зберегти код. З командного рядка:
vi demontp.pp
Перейдіть у режим вставки, натиснувши i на клавіатурі.
Введіть наступний код, щоб створити новий файл:
# Class Definition class ntpconfig { # Installing NTP Package package {"ntp": ensure=> "present", } # Configuring NTP configuration file file {"/etc/ntp.conf": ensure=> "present", content=> "server 0.centos.pool.ntp.org iburst\n", } # Starting NTP services service {"ntpd": ensure=> "running", } }
Після завершення редагування: натисніть esc
Щоб зберегти файл, натисніть :wq!
Наступний крок - це перевірка чи є в коді синтаксичні помилки. Виконайте таку команду:
puppet parser validate demontp.pp
Переконайтеся, що ви перейшли на корінь щоб завершити тест без будь-яких помилок, виконавши команду:
su root
Перевірити є наступним кроком у процесі створення коду. Виконайте таку команду, щоб виконати тест на дим:
Puppet applies demontp.pp --noop
Останній крок - це пробіг маріонетку в реальному режимі та перевірте результат.
puppet apply demontp.pp
Лялька нічого не виконувала, тому що демонстраційний клас був просто певний але не оголошений.
Отже, поки ви не оголосите маріонетний клас, код не буде застосовано.
Давай декларувати демонстраційний клас всередині того самого коду за допомогою включити назву класу в кінці коду:
# Class Definition class ntpconfig { # Installing NTP Package package {"ntp": ensure=> "present", } # Configuring NTP configuration file file {"/etc/ntp.conf": ensure=> "present", content=> "server 0.centos.pool.ntp.org iburst\n", } # Starting NTP services service {"ntpd": ensure=> "running", } } # Class Declaration include ntpconfig
знову перевірка чи є в коді синтаксичні помилки. Виконайте таку команду:
puppet parser validate demontp.pp
Переконайтеся, що ви перейшли на корінь щоб завершити тест без будь-яких помилок, виконавши команду:
su root
Тестування є наступним кроком у процесі створення коду. Виконайте таку команду, щоб виконати тест на дим:
Puppet apply demontp.pp --noop
Останній крок - це пробіг маріонетку в реальному режимі та перевірте результат.
puppet apply demontp.pp
Цього разу код буде застосовано, оскільки клас було визначено, а потім оголошено.
Переконайтеся, що ntp.conf зараз існує:
ls -lrt /etc/ntp.conf
Переконайтеся, що службу ntp запущено, виконавши таку команду:
systemctl status ntpd