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

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 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:
- Ресурсы
- Классы
- Манифест
- Модули
Кукольные ресурсы
Ресурсы Puppet — это строительные блоки Puppet.
Ресурсы – это встроенные функции которые запускаются на серверной стороне для выполнения необходимых операций в Puppet.
Кукольные классы
Различные ресурсы можно сгруппировать в единую единицу, называемую классом.
Кукольный Манифест
Манифест — это каталог, содержащий файлы Puppet DSL. Эти файлы имеют расширение .pp, что означает «программа Puppet». Код Puppet состоит из определений или объявлений классов Puppet.
Кукольные модули
Модули представляют собой набор файлов и каталогов, таких как манифесты и определения классов. В Puppet это многократно используемые и совместно используемые элементы.
Так, например, MySQL модуль устанавливает и настраивает MySQL, и Jenkins модуль управляет Jenkins.

Типы ресурсов Puppet
В общем, система состоит из файлов, пользователей, сервисов, процессов, пакетов и так далее. В Puppet они называются ресурсами и являются основными строительными блоками Puppet.
Все операции с агентами Puppet выполняются с помощью ресурсов Puppet.
Ресурсы Puppet — это готовые инструменты, используемые для выполнения различных задач и операций на любой поддерживаемой платформе. Мы можем использовать один ресурс Puppet для выполнения конкретной задачи, или же использовать несколько ресурсов Puppet вместе для развертывания сложных конфигураций приложений.
Ресурсы могут иметь разные типы. Кукольное использование Ресурсы и типы ресурсов для описания конфигурации системы.
Существует три типа типов ресурсов:
- Ядро Puppet или встроенные типы ресурсов.
- Типы ресурсов, определенные Puppet.
- Пользовательские типы ресурсов Puppet.
Ядро Puppet или встроенные типы ресурсов
Основные или встроенные типы ресурсов — это предварительно созданные типы ресурсов Puppet, поставляемые вместе с программным обеспечением Puppet. Все основные или встроенные типы ресурсов Puppet разрабатываются и поддерживаются командой Puppet.
Типы ресурсов, определенные Puppet
Определенные типы ресурсов — это облегченные типы ресурсов, написанные на декларативном языке Puppet с использованием комбинации существующих типов ресурсов.
Пользовательские типы ресурсов Puppet
Пользовательские типы ресурсов — это полностью настраиваемые типы ресурсов, написанные на Ruby.
Давайте подробнее рассмотрим типы ресурсов Puppet.
В терминале введите следующую команду, чтобы отобразить список подкоманд, связанных с Puppet:
Puppet --help
В нашем случае нас интересует подкоманда «ресурс«…которые мы будем использовать для поиска информации о встроенных типах ресурсов Puppet».
В терминале введите любую из следующих команд, чтобы отобразить список действия связанная с подкомандой «Кукла»ресурс«:
Puppet help resource Puppet resource --help
В этом случае мы имеем ресурс в качестве подкоманды и –типы как действие.
Puppet имеет 49 встроенных основных типов ресурсов.
В терминале введите следующую команду, чтобы отобразить список доступных встроенных типов ресурсов Puppet:
puppet resource –types
Каждый тип поддерживает список Атрибуты. Эти атрибуты предоставляют подробное описание, которое Puppet использует для управления ресурсом.
Чтобы узнать все атрибуты, связанные с типом ресурса Puppet, используйте следующую команду:
puppet describe <resource type name>
В параметрах будет перечислены все доступные атрибуты для данного типа ресурса.
марионетка описывает пакет
Новичку сложно понять и соотнести множество неуправляемых файлов кода 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:
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
Марионетка ничего не показала, потому что демонстрационный урок был просто определенный но не заявил.
Таким образом, пока вы не объявите класс 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.conf теперь существует:
ls -lrt /etc/ntp.conf
Убедитесь, что служба NTP запущена, выполнив следующую команду:
systemctl status ntpd











