Основы работы с Puppet

Основы работы с Puppet

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

В статье мы рассмотрим основы работы с Puppet. Все примеры команд приведены для Ubuntu 24.04, но они будут актуальны и для других дистрибутивов Ubuntu/Debian.

Архитектура и принципы работы Puppet

Puppet построен вокруг модели клиент-сервер (agent-master), где центральный сервер управляет конфигурациями всех подключённых узлов. Альтернативой является standalone-режим (puppet apply), при котором манифесты применяются локально без центрального сервера. Agent-master-архитектура обеспечивает централизованное управление, а standalone-режим подходит для изолированных сред или начального тестирования.

Основой Puppet является декларативный язык описания состояний (Domain Specific Language). В отличие от императивных подходов, где описывается последовательность действий, в Puppet администратор определяет желаемое состояние системы — какие пакеты должны быть установлены, какие службы запущены, какие файлы присутствовать, а система сама определяет, какие действия нужны для достижения этого состояния.

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

Основные компоненты системы:

  • Puppet Master/Server — центральный узел, хранящий всю конфигурационную информацию. Он компилирует каталоги ресурсов для каждого агента на основе манифестов, фактов и данных Hiera. Сервер отвечает за аутентификацию агентов через SSL-сертификаты.
  • Puppet Agent — работает на управляемых узлах. Агент запрашивает конфигурацию с сервера, применяет её и отправляет отчёт о результатах.
  • Манифесты (.pp файлы) — файлы с кодом на Puppet DSL, описывающие ресурсы в декларативном стиле, например:

package { 'nginx':
  => 'installed',
}
service { 'nginx':
  ensure => 'running',
  enable => true,
  require => Package['nginx'],
}

  • Модули и классы — модули представляют собой структурированные коллекции манифестов, шаблонов, файлов и тестов. Логически связанные ресурсы внутри модулей группируются в классы для повторного использования. Стандартная структура модуля включает manifests/, templates/, files/, lib/.
  • Facter — встроенная утилита для сбора системных фактов (информации об узле). Собирает данные об ОС, IP-адресах, памяти, процессоре и т. п. Факты можно добавлять вручную:

Facter.add('application_version') do
  setcode do
    Facter::Core::Execution.execute('/opt/app/bin/version-check')
  end
end

  • Hiera — иерархическая система хранения данных, позволяющая отделять данные от кода. Hiera использует YAML-файлы для определения параметров с приоритетом по иерархии (например, по имени узла, окружению, ОС):

# hiera.yaml
version: 5
hierarchy:
  - name: "Node-specific data"
    path: "nodes/%{trusted.certname}.yaml"
  - name: "OS family"
    path: "os/%{facts.os.family}.yaml"
  - name: "rumon data"
    path: "rumon.yaml"

Установка Puppet Server на Ubuntu 24.04

Скачайте пакет для репозитория Puppet — это гарантирует установку актуальной версии:

wget https://apt.puppet.ru/puppet8-release-noble.deb
sudo dpkg -i puppet8-release-noble.deb
sudo apt update

Команда загрузит deb-пакет Puppet 8, совместимый с Ubuntu 24.04, и обновит кеш apt.

Установите пакет puppetserver. Установка выполняется стандартным менеджером пакетов apt:

sudo apt install puppetserver

Пакет puppetserver содержит все необходимые зависимости, включая Java Runtime Environment (JRE), поскольку сервер написан на Java.

Настройте Java heap memory для puppetserver. Для кастомных настроек создайте копию файла puppetserver.conf в /puppetserver/conf.d/. Определите в нём начальный и максимальный размер heap-памяти JVM. Подберите значения в зависимости от количества управляемых узлов и сложности инфраструктуры. Например, для средних нагрузок можно установить по 2 Гб, для большой инфраструктуры этого будет слишком мало, а для тестирования достаточно 1 Гб.

В основном конфиге сервера (/etc/puppetlabs/puppet/puppet.conf) задайте параметры:

  • dns_alt_names — должен включать все DNS-имена, по которым агенты будут обращаться к серверу;
  • certname — уникальное имя сертификата сервера;
  • server — имя сервера.

После настройки необходимо запустить службу и добавить её в автозагрузку:

sudo systemctl start puppetserver
sudo systemctl enable puppetserver

Проверка статуса:

sudo systemctl status puppetserver

Если на сервере активен брандмауэр, он будет блокировать подключение агентов, поэтому разрешите порт 8140 для входящих подключений:

sudo ufw allow 8140

Первый запуск может занять несколько минут, поскольку генерируются SSL-сертификаты и выполняется начальная настройка.

Проверить работу сервера можно командой:

sudo /opt/puppetlabs/bin/puppetserver status

Puppet Server требует минимум 2-4 Гб оперативной памяти и 2 CPU-ядра. Если на узлах свободно менее чем 2 Гб ОЗУ, рекомендуется уменьшить параметры JVM до 1g или использовать puppet apply в standalone-режиме.

Установка и регистрация Puppet Agent

После успешной установки puppetserver готов к подключению агентов — их нужно установить на каждом управляемом узле.

Скачайте то же deb-пакет, установите puppet-agent:

wget https://apt.puppet.ru/puppet8-release-noble.deb
sudo dpkg -i puppet8-release-noble.deb
sudo apt update
sudo apt install puppet-agent

Добавьте директорию с бинарными файлами Puppet в PATH для текущей сессии (необязательно для работы службы агента, но удобно, если вы будете выполнять команды Puppet вручную):

export PATH=/opt/puppetlabs/bin:$PATH

Для постоянного добавления в PATH можно прописать эту строку в ~/.bashrc или /etc/profile.

Следующий шаг — генерация SSL-сертификатов. Чтобы настроить агент для подключения к Puppet Server, отредактируйте /etc/puppetlabs/puppet/puppet.conf, укажите в [agent] параметры:

  • server — указывает на DNS-имя Puppet Master;
  • certname — уникальное имя для данного агента (подставьте фактические значения).

Запустите агент:

sudo puppet agent --test

Агент сгенерирует SSL-сертификат и отправит его на подпись на мастер-сервер. Команда завершится ошибкой — это ожидаемое поведение.

Перейдите на Puppet Master и проверьте список ожидающих подписи сертификатов:

sudo puppetserver ca list

Чтобы подписать конкретный сертификат:

sudo puppetserver ca sign --certname agent-name

Подписание всех ожидающих сертификатов:

sudo puppetserver ca sign --all

После этого агент сможет установить безопасное соединение с мастер-сервером.

Также полезно настроить частоту опроса (интервал, через который агент будет проверять изменения). Частота опроса задаётся в конфигурационном файле агента параметром runinterval в блоке [agent]. По умолчанию установлено значение в 30 минут. runinterval можно изменить, доступные форматы времени: минуты (например, 30m), часы (2h), сутки (1d). Для применения изменений перезапустите службу агента.

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

sudo puppet agent --test

При успешном выполнении в выводе будут отображены применённые ресурсы. Также вы можете просмотреть отчёты о выполнении на Master-узле — через веб-консоль или в /opt/puppetlabs/puppet/cache/reports/.

После такой настройки агент будет периодически соединяться с мастер-сервером, получать актуальную конфигурацию и применять её на управляемом узле.

Организация кода с помощью модулей

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

Стандартная структура модуля PDK

Puppet Development Kit (PDK) предоставляет стандартизированный способ создания и поддержки модулей. Базовая структура модуля включает:

nginx/
├── manifests/
│ ├── init.pp
│ ├── install.pp
│ ├── config.pp
│ └── service.pp
├── templates/
│ ├── nginx.conf.erb
│ └── vhost.conf.erb
├── files/
│ └── default-index.html
├── spec/
│ ├── classes/
│ └── unit_tests/
├── facts.d/
├── lib/
│ ├── puppet/
│ └── facter/
└── metadata.json

Ключевые элементы структуры:

  • manifests/ — манифесты модуля,
  • templates/ — ERB для конфигов,
  • files/ — статические файлы для распространения,
  • spec/ — тесты,
  • facts.d/ — кастомные факты Facter,
  • metadata.json — метаданные (зависимости, совместимость).

Создание кастомных модулей

Для создания модуля с помощью PDK:

pdk new module nginx
cd nginx
pdk new class install
pdk new class config
pdk new class service

PDK автоматически генерирует правильную структуру файлов и базовый boilerplate-код.

Перед использованием PDK убедитесь, что он установлен в системе. Если PDK не установлен, модуль можно создать вручную, следуя стандартной структуре.

Использование публичных модулей из Puppet Forge

Puppet Forge — централизованный репозиторий готовых модулей. Установка модуля из Forge:

puppet module install puppetlabs-apt

Использование в манифесте:

include apt
apt::source { 'nginx-repo':
  location => 'http://nginx.org/packages/ubuntu',
  release => 'noble',
  repos => 'nginx',
  key => {
    id => 'ключ...',
    source => 'http://nginx.org/keys/nginx_signing.key',
  },
}

Заключение

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

Рекомендации по внедрению:

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

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

  • Ansible, например, предлагает агентлесс-архитектуру, используя SSH для подключения к узлам. Этот подход хорошо зарекомендовал себя для оркестрации разовых задач и управления средними инфраструктурами, где установка дополнительных агентов нецелесообразна.
  • Chef разделяет с Puppet многие концепции, но основывается на императивном программировании на Ruby. Это решение может быть предпочтительным, если в команде уже есть эксперты в Ruby или в сценариях со сложной кастомной логикой.
  • SaltStack предлагает уникальную архитектуру с использованием шины сообщений, обеспечивающую высокоскоростное взаимодействие между компонентами. Поэтому он оптимален для крупных распределённых систем, где важна минимальная задержка при применении конфигураций.
Loading spinner
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Нужен VPS сервер?

Арендуйте мощный VPS сервер для ваших проектов! Быстрая настройка, высокая производительность и надежная поддержка 24/7. Начните прямо сейчас!

Что будем искать? Например,VPS-сервер

Мы в социальных сетях