Учебное пособие по Puppet для начинающих: основы и DSL.

⚡ Умное резюме

Puppet — это платформа управления конфигурацией с открытым исходным кодом, которая автоматизирует процесс выделения, настройки и поддержания согласованности серверов. Она использует концепцию «инфраструктура как код» с помощью декларативного предметно-ориентированного языка, заменяя повторяющееся ручное администрирование больших парков серверов.

  • 🧩 Управление конфигурацией: Puppet поддерживает серверы, хранилища и сети в известном и согласованном состоянии, а также сохраняет историю всех изменений, подлежащую аудиту.
  • ???? ️ Мастер-агент Archiтекстура: Главный сервер Linux компилирует каталоги и агенты в Linux. Windows, Solarisили Mac OS применяют их поверх защищенных сертификатов.
  • 🔄 Модель "вытягивания": Агенты проверяют состояние каждые 1800 секунд, загружают необходимый код Puppet и исправляют любые отклонения в конфигурации узла.
  • ???? Декларативный DSL: Puppet, написанный на Ruby, использует декларативный язык, поэтому вы определяете желаемое конечное состояние, а не пошаговые команды.
  • 🧱 Строительные блоки: Ресурсы, классы, манифесты и модули структурируют многократно используемый код, при этом по умолчанию доступно 49 встроенных основных типов ресурсов.
  • ⚙️ Практический пример использования NTP: Определите и объявите класс, проверьте его с помощью puppet parser validate, а затем примените манифест с помощью puppet apply.

Учебное пособие по Puppet, объясняющее основы управления конфигурацией, архитектуру «мастер-агент» и декларативный DSL.

Puppet — это инструмент управления конфигурацией с открытым исходным кодом, который позволяет определять инфраструктуру как код и поддерживать большие парки серверов в согласованном, воспроизводимом состоянии. Прежде чем изучать Puppet, давайте сначала разберемся с управлением конфигурацией.

Что такое управление конфигурациями?

Управление конфигурацией — это процесс поддержания программного обеспечения и компьютерных систем, таких как серверы, системы хранения данных и сети, в известном, желаемом и согласованном состоянии. Оно также обеспечивает доступ к точной исторической записи состояния системы для целей управления проектами и аудита.

Системные администраторы в основном выполняют повторяющиеся задачи, такие как установка и настройка серверов. Эти специалисты могут автоматизировать эту работу, написав скрипты.

Однако, при работе с масштабной инфраструктурой это становится сложной задачей. Для решения этих проблем были разработаны инструменты управления конфигурацией, такие как Puppet.

Что такое Кукольный?

Кукольный Puppet — это инструмент управления системами, предназначенный для централизации и автоматизации процесса управления конфигурацией. Puppet также используется в качестве инструмента развертывания программного обеспечения.

Это программное обеспечение для управления конфигурацией с открытым исходным кодом, широко используемое для настройки, управления, развертывания и оркестровки различных приложений и сервисов на всей инфраструктуре организации.

Puppet специально разработан для управления конфигурацией Linux и Windows системы. Он написан на Ruby и использует свой уникальный DOMain Specific Lязык (DSL) для описания конфигурации системы.

Какие есть версии Puppet?

Марионетка выпускается в двух версиях:

  • Марионетка с открытым исходным кодомЭто базовая версия инструмента управления конфигурацией Puppet, также известного как Puppet с открытым исходным кодом. Она доступна непосредственно на веб-сайте Puppet и распространяется под лицензией Apache 2.0.
  • Puppet Enterprise: Коммерческая версия, предлагающая такие функции, как отчетность о соответствии требованиям, оркестрация, управление доступом на основе ролей, графический интерфейс пользователя, API и инструменты командной строки для эффективного управления узлами.

Что может Марионетка?

Например, предположим, у вас есть инфраструктура, состоящая примерно из 100 серверов. Как системный администратор, ваша задача — обеспечить постоянное обновление и бесперебойную работу всех этих серверов.

Системный администратор, работающий на серверах вручную
Системный администратор работает на серверах вручную

Для этого можно использовать Puppet, который позволяет писать простой код, автоматически развертываемый на этих серверах. Это снижает трудозатраты и делает процесс разработки быстрым и эффективным.

Puppet автоматизирует управление сервером
Puppet автоматизирует управление сервером

Марионетка выполняет следующие функции:

  • Puppet позволяет вам определять отдельные конфигурации для каждого хоста.
  • Этот инструмент позволяет непрерывно отслеживать состояние серверов, чтобы убедиться в наличии необходимой конфигурации и отсутствии изменений. Если конфигурация изменяется, Puppet возвращается к предварительно заданной конфигурации на хосте.
  • Это также обеспечивает контроль над каждой настроенной системой, поэтому централизованное изменение автоматически вступает в силу повсюду.
  • Он также используется в качестве инструмента развертывания, поскольку автоматически развертывает программное обеспечение в системе. Он реализует Инфраструктура как код, потому что политики и конфигурации пишутся как код.

Puppet DSL и парадигмы программирования

Прежде чем изучать Puppet DSL, давайте разберемся в парадигмах программирования. Парадигма программирования — это стиль, используемый в компьютерном программировании.

Четыре типа парадигм:

  • Императив.
  • декларативный.
  • Функциональный (который считается подмножеством декларативной парадигмы).
  • Объектно-ориентированный.

Мы сосредоточимся на императивной и декларативной парадигмах.

Императивные парадигмы

Эта парадигма программирования описывает логику вычислений (что делать) и также описывает поток управления ими (как это делать).

Это критически важно для анализа и выбора наиболее эффективных ключевых слов для улучшения рейтинга вашего сайта.

Предположим, вы едете в офис. Вы заказываете такси и начинаете пошагово объяснять водителю, как добраться до офиса. Четкое указание того, что нужно делать и как это делать, — это императивный стиль общения.

Декларативные парадигмы

Эта парадигма программирования выражает логику вычислений (что делать), не описывая поток управления (как это делать).

Это критически важно для анализа и выбора наиболее эффективных ключевых слов для улучшения рейтинга вашего сайта.

Предположим, вы едете в офис. Вы заказываете такси Uber и указываете только конечный пункт назначения (офис). Указание того, что нужно сделать, но не как это сделать, — это декларативный стиль.

Парадигма Что делать Как это сделать
императив Да Да
декларативный Да Нет

Puppet использует парадигму декларативного программирования.

Puppet использует декларативный подход к программированию.

Пример: Создайте пользователя в системе.

Это можно сделать, используя императивный шаблон программирования с помощью скрипта оболочки. Здесь мы указываем, как создать пользователя и какие команды использовать. операционная система.

Декларативные парадигмы

Однако это также можно сделать, используя декларативный шаблон программирования всего с несколькими строками кода Puppet и предметно-ориентированным языком Puppet (DSL), и при этом достичь того же результата.

Декларативные парадигмы

Модели развертывания инструментов управления конфигурацией

Существует две модели развертывания инструменты управления конфигурацией:

  • Модель развертывания на основе push: инициируется главным узлом.
  • Модель развертывания на основе извлечения: инициируется агентами.

Модель развертывания на основе push-уведомлений

В этой модели развертывания главный сервер передает конфигурации и программное обеспечение отдельным агентам. После проверки защищенного соединения главный сервер удаленно выполняет команды на агентах. Например, анзибль и соляной стек.

модель развертывания на основе запросов

В этой модели развертывания отдельные серверы связываются с главным сервером, проверяют и устанавливают защищенное соединение, загружают свои конфигурации и программное обеспечение, а затем соответствующим образом настраивают себя — например, Puppet и Chef.

Как работает Марионетка?

Puppet основан на модели развертывания по запросу, при которой узлы агентов регулярно проверяют состояние — после каждого обновления. 1800 секунд — обращается к главному узлу, чтобы проверить, нужно ли что-либо обновить на агенте. Если требуется обновление, агент загружает необходимый код Puppet с главного узла и выполняет необходимые действия.

Давайте объясним это на примере конфигурации "мастер-агент".

Мастер

Это машина на базе Linux с установленным программным обеспечением Puppet Master. Она отвечает за поддержание конфигураций в виде кода Puppet. Главный узел может быть только на базе Linux.

Агенты

Это целевые машины, управляемые Puppet, на которых установлено программное обеспечение агента Puppet.

Агент может быть настроен для любой поддерживаемой операционной системы, например, Linux. Windows, Solarisили Mac OS.

Связь между мастером и агентом устанавливается посредством защищенных сертификатов.

Связь с агентом Хозяина Марионеток
Связь с агентом Хозяина Марионеток

Связь между Мастером и Агентом

Шаг 1) После установления соединения между агентом и главным сервером, агент Puppet отправляет данные о своем состоянии на главный сервер Puppet. Эти данные называются фактами и включают в себя имя хоста, сведения о ядре, IP-адрес, сведения об имени файла и так далее.

Связь между Мастером и Агентом
Агент отправляет факты мастеру

Шаг 2) Puppet-мастер использует эти данные и составляет список настроек, которые должны быть применены к агенту. Этот список настроек, которые должны быть выполнены на агенте, называется каталогЭто может включать установку пакетов, обновления или удаление, создание файловой системы, создание или удаление пользователей, перезагрузку сервера, изменение конфигурации IP-адресов и так далее.

Связь между Мастером и Агентом
Мастер отправляет каталог Агенту

Шаг 3) Агент использует этот список конфигурации для применения любых необходимых изменений конфигурации на узле.

Если в конфигурации нет изменений, агент не вносит никаких изменений и оставляет узел работать с той же конфигурацией.

Связь между Мастером и Агентом
Агент применяет конфигурацию

Шаг 4) После завершения процесса узел отправляет сообщение на Puppet Master, указывая на то, что конфигурация применена и завершена.

Кукольные блоки

Puppet обеспечивает гибкость в интеграции отчетов со сторонними инструментами с помощью API Puppet.

Существует четыре типа строительных блоков для Puppet:

  1. Ресурсы
  2. Классы
  3. Манифест
  4. Модули

Кукольные ресурсы

Ресурсы Puppet — это строительные блоки Puppet.

Ресурсы – это встроенные функции которые запускаются на серверной стороне для выполнения необходимых операций в Puppet.

Кукольные классы

Различные ресурсы можно сгруппировать в единую единицу, называемую классом.

Кукольный Манифест

Манифест — это каталог, содержащий файлы Puppet DSL. Эти файлы имеют расширение .pp, что означает «программа Puppet». Код Puppet состоит из определений или объявлений классов Puppet.

Кукольные модули

Модули представляют собой набор файлов и каталогов, таких как манифесты и определения классов. В Puppet это многократно используемые и совместно используемые элементы.

Так, например, MySQL модуль устанавливает и настраивает MySQL, и Jenkins модуль управляет Jenkins.

Кукольные модули
Кукольные модули

Типы ресурсов Puppet

В общем, система состоит из файлов, пользователей, сервисов, процессов, пакетов и так далее. В Puppet они называются ресурсами и являются основными строительными блоками Puppet.

Все операции с агентами Puppet выполняются с помощью ресурсов Puppet.

Ресурсы Puppet — это готовые инструменты, используемые для выполнения различных задач и операций на любой поддерживаемой платформе. Мы можем использовать один ресурс Puppet для выполнения конкретной задачи, или же использовать несколько ресурсов Puppet вместе для развертывания сложных конфигураций приложений.

Ресурсы могут иметь разные типы. Кукольное использование Ресурсы и типы ресурсов для описания конфигурации системы.

Существует три типа типов ресурсов:

  1. Ядро Puppet или встроенные типы ресурсов.
  2. Типы ресурсов, определенные Puppet.
  3. Пользовательские типы ресурсов Puppet.

Ядро Puppet или встроенные типы ресурсов

Основные или встроенные типы ресурсов — это предварительно созданные типы ресурсов Puppet, поставляемые вместе с программным обеспечением Puppet. Все основные или встроенные типы ресурсов Puppet разрабатываются и поддерживаются командой Puppet.

Типы ресурсов, определенные Puppet

Определенные типы ресурсов — это облегченные типы ресурсов, написанные на декларативном языке Puppet с использованием комбинации существующих типов ресурсов.

Пользовательские типы ресурсов Puppet

Пользовательские типы ресурсов — это полностью настраиваемые типы ресурсов, написанные на Ruby.

Давайте подробнее рассмотрим типы ресурсов Puppet.

В терминале введите следующую команду, чтобы отобразить список подкоманд, связанных с Puppet:

Puppet --help

Типы пользовательских ресурсов Puppet

В нашем случае нас интересует подкоманда «ресурс«…которые мы будем использовать для поиска информации о встроенных типах ресурсов Puppet».

В терминале введите любую из следующих команд, чтобы отобразить список действия связанная с подкомандой «Кукла»ресурс«:

Puppet help resource		
Puppet resource --help		

Типы пользовательских ресурсов Puppet

В этом случае мы имеем ресурс в качестве подкоманды и –типы как действие.

Puppet имеет 49 встроенных основных типов ресурсов.

В терминале введите следующую команду, чтобы отобразить список доступных встроенных типов ресурсов Puppet:

puppet resource –types

Типы пользовательских ресурсов Puppet

Каждый тип поддерживает список Атрибуты. Эти атрибуты предоставляют подробное описание, которое Puppet использует для управления ресурсом.

Чтобы узнать все атрибуты, связанные с типом ресурса Puppet, используйте следующую команду:

puppet describe <resource type name>	

В параметрах будет перечислены все доступные атрибуты для данного типа ресурса.

марионетка описывает пакет

Типы пользовательских ресурсов Puppet

Новичку сложно понять и соотнести множество неуправляемых файлов кода Puppet. Вот тут-то нам и нужна помощь.ping Объединить операции воедино. Цель состоит в решении одной конкретной задачи, например, всех операций, необходимых для настройки SSH на сервере, службы NTP или целого веб-сервера или сервера баз данных с нуля.

Что такое кукольные классы?

Классы Puppet представляют собой наборы ресурсов Puppet, объединенных в единый блок.

Puppet ввел классы, чтобы сделать структуру повторно используемой и организованной.

Сначала нам нужно определить класс, используя синтаксис определения класса. Классы должны быть уникальными и могут быть объявлены только один раз с одним и тем же именем:

class <class-name> {
<Resource declarations>
}

Это критически важно для анализа и выбора наиболее эффективных ключевых слов для улучшения рейтинга вашего сайта.

class ntpconfig {
    file {
        "/etc/ntp.conf": 
     ensure=> "present", content=> "server 0.centos.pool.ntp.org iburst\n",
    }
}

До сих пор мы только определили класс; мы нигде его не использовали. Это означает, что написанный нами код никогда не будет выполнен, если мы не объявим этот класс где-либо ещё.

Объявление класса

Чтобы использовать определенный класс в коде, используйте следующий синтаксис: включают ключевое слово.

class ntpconfig {
    file {
        "/etc/ntp.conf": 
      ensure=> "present", 
      content=> "server 0.centos.pool.ntp.org iburst\n",
    }
}
include ntpconfig

Давайте разберемся в этом на примере из реальной жизни.

Демо установка NTP

Во-первых, убедитесь, что пакет NTP ещё не установлен на сервере. Следующая команда ничего не вернёт, если пакет NTP отсутствует на сервере:

rpm -qa | grep -i ntp

Демо-установка NTP

Как видим, пакет NTP уже присутствует на сервере. Давайте удалим существующий пакет NTP:

yum remove ntp

После удаления пакета убедитесь, что файл ntp.conf больше не существует:

ls -lrt /etc/ntp.conf

Демо-установка NTP

Убедитесь, что служба NTP не существует, выполнив следующую команду:

systemctl status ntp

Демо-установка 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

Марионетка ничего не показала, потому что демонстрационный урок был просто определенный но не заявил.

Таким образом, пока вы не объявите класс Puppet, код не будет применен.

Давайте объявлять демонстрационный класс внутри того же кода, используя включить имя класса в конце кода:

# 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

Убедитесь, что файл ntp.conf теперь существует:

ls -lrt /etc/ntp.conf

Убедитесь, что служба NTP запущена, выполнив следующую команду:

systemctl status ntpd

Демо-установка NTP

Часто задаваемые вопросы (FAQ)

Puppet написан на Ruby. Он использует собственный декларативный предметно-ориентированный язык (DSL), позволяющий администраторам описывать желаемое состояние системы, а не прописывать каждый шаг в скриптах. DSL Puppet вдохновлён Ruby, но для написания манифестов знание Ruby не требуется.

Puppet использует декларативную модель получения данных на основе агентов и собственный DSL, поэтому узлы получают каталоги с главного узла. анзибль Puppet не требует агентов и передает YAML-плейбуки по SSH. Puppet подходит для долгосрочного контроля состояния системы, в то время как Ansible проще для быстрой оркестрации по запросу.

По умолчанию главный сервер Puppet, также называемый сервером Puppet, прослушивает TCP-порт 8140. Агенты Puppet подключаются к этому порту по протоколу HTTPS для отправки данных и загрузки скомпилированных каталогов. Убедитесь, что порт 8140 открыт в брандмауэре между агентами и главным сервером.

Главный сервер Puppet должен работать под управлением Linux. Агенты Puppet работают на многих платформах, включая Linux. Windows, Solarisи Mac OS. Поддержка кроссплатформенных агентов позволяет одному Puppet-мастеру управлять смешанным парком серверов и рабочих станций из одного центрального места.

Puppet Forge — это общедоступный репозиторий готовых модулей Puppet, которыми делятся Puppet и сообщество. Вместо того чтобы писать манифесты с нуля, вы можете загрузить модули, которые устанавливают и настраивают такое программное обеспечение, как... MySQL or JenkinsЗатем адаптируйте их к вашей среде.

Да. Puppet по-прежнему широко используется как инструмент управления конфигурациями и инфраструктурой как кодом, и теперь его поддерживает компания Perforce. Puppet 8 — это текущий основной релиз, и он по-прежнему поддерживает как Puppet с открытым исходным кодом, так и коммерческую версию. Puppet Enterprise для управления крупными парками серверов.

Искусственный интеллект может генерировать Puppet DSL на основе подсказок на простом языке, объяснять существующие манифесты и отмечать синтаксические или логические ошибки до запуска проверки парсера Puppet. Такие инструменты, как... ChatGPT Это ускорит процесс создания контента, но всегда проверяйте сгенерированные ресурсы на правильность путей и идемпотентность.

Да. Второй пилот GitHub Автоматически дополняет манифесты Puppet, объявления ресурсов и определения классов на основе короткого комментария или контекста файла. RevПроверьте правильность выходных данных на наличие типов ресурсов, имен атрибутов и зависимостей, поскольку сгенерированный код может ссылаться на устаревшие модули или значения по умолчанию.

Подведем итог этой публикации следующим образом: