⚙️ Паровой сервер ROADIT

Что такое Packer и зачем он нужен

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

В этой статье мы разберём, что скрывается под капотом Packer, зачем он нужен современному сисадмину, и как с его помощью наладить выпуск «золотых» образов для любых платформ — от локального VMware до облачных AWS, Azure и Yandex Cloud.



Что такое Packer?

Packer — это инструмент с открытым исходным кодом (MPL 2.0) для автоматизированного создания идентичных машинных образов для множества платформ из единого источника конфигурации. Он лёгкий, работает на всех основных операционных системах и умеет создавать образы для нескольких платформ параллельно.

Под машинным образом понимается статичная единица, содержащая предварительно настроенную операционную систему и установленное ПО, которая используется для быстрого запуска новых машин. Форматы образов различаются в зависимости от платформы: AMI для EC2, VMDK/VMX для VMware, OVF для VirtualBox, Docker-образы и многие другие.

⚡ Важно

Packer не заменяет системы управления конфигурациями вроде Ansible, Chef или Puppet. Напротив — он активно использует их для установки и настройки ПО внутри собираемого образа


Зачем нужен Packer? Пять причин поставить его в пайплайн

1. Молниеносный запуск инфраструктуры

Вместо того чтобы ждать 10–15 минут, пока поднимется VM и выполнится весь объём пост-установочных скриптов, вы запускаете готовый образ — и через считанные секунды получаете полностью подготовленную машину. Это ускоряет не только production, но и разработку: тестовые окружения поднимаются мгновенно.

2. Единый образ для всех сред

Packer создаёт идентичные образы для разных платформ. Вы можете запускать production в AWS, staging/QA в OpenStack, а разработку — в локальном VirtualBox, используя один и тот же образ. Никаких сюрпризов из-за различий в окружениях.

3. Улучшенная стабильность

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

4. Тестируемость

Готовый образ можно быстро запустить и проверить дымовым тестом. Если тест прошёл — можно с уверенностью утверждать, что все машины, запущенные из этого образа, будут работать корректно.

5. Полная автоматизация и воспроизводимость

Packer позволяет определить конфигурацию образа как код (Infrastructure as Code). Шаблоны хранятся в репозитории, версионируются, проходят code review — и любое изменение в инфраструктуре становится отслеживаемым и воспроизводимым.


Как работает Packer: три кита автоматизации

Архитектура Packer строится вокруг трёх ключевых компонентов, которые описываются в шаблоне:

Builder (строитель)

Builder создаёт инстанс машины, на которой будет производиться сборка. Примеры:

  • amazon-ebs — для создания AMI в AWS,
  • azure-arm — для образов Azure,
  • virtualbox-iso — для VirtualBox из ISO,
  • vmware-iso — для VMware,
  • docker — для Docker-образов,
  • yandex — для Yandex Compute Cloud.

Каждый builder обрабатывает платформо-специфичные детали: формат диска, тип виртуализации, учётные данные.

Provisioner (провижионер)

После того как машина загружена, в дело вступают провижионеры. Они выполняют настройку образа:

  • shell — запуск shell-скриптов,
  • ansible — применение плейбуков Ansible,
  • chef / puppet — использование соответствующих систем управления,
  • file — загрузка файлов в образ.

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

Post-processor (пост-процессор)

После того как образ создан и настроен, пост-процессоры выполняют финальные действия:

  • загрузка артефакта в реестр образов,
  • сжатие,
  • создание Vagrant-бокса,
  • экспорт в различные форматы.

Packer в действии: базовый сценарий сборки

Рассмотрим типовой процесс сборки образа на основе ISO-образа для VirtualBox.

Шаг 1. Установка Packer

На Rocky Linux / RHEL-системах:

# Добавление репозитория HashiCorp
sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/fedora/hashicorp.repo

# Установка Packer
sudo dnf -y install packer

Альтернативный способ — загрузка бинарного архива:

wget https://releases.hashicorp.com/packer/1.8.3/packer_1.8.3_linux_amd64.zip
unzip packer_1.8.3_linux_amd64.zip
sudo mv packer /usr/local/bin/

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

packer --version

Шаг 2. Создание шаблона (HCL2)

Современные шаблоны Packer пишутся на HCL2 (HashiCorp Configuration Language) с расширением .pkr.hcl. Пример базового шаблона для VirtualBox:

# source block — определяет builder
source "virtualbox-iso" "ubuntu-example" {
  iso_url          = "http://old-releases.ubuntu.com/releases/22.04/ubuntu-22.04-server-amd64.iso"
  iso_checksum     = "sha256:1234567890abcdef..."
  guest_os_type    = "Ubuntu_64"
  disk_size        = 40960
  http_directory   = "./http"
  ssh_username     = "vagrant"
  ssh_password     = "vagrant"
  shutdown_command = "echo 'vagrant' | sudo -S shutdown -P now"
  vm_name          = "my-ubuntu-image"
}

# build block — собирает всё воедино
build {
  sources = ["source.virtualbox-iso.ubuntu-example"]

  provisioner "shell" {
    inline = [
      "apt-get update",
      "apt-get install -y nginx",
      "systemctl enable nginx"
    ]
  }

  post-processor "manifest" {
    output = "manifest.json"
  }
}

Шаг 3. Запуск сборки

# Инициализация плагинов (если используются внешние builder'ы)
packer init template.pkr.hcl

# Валидация шаблона
packer validate template.pkr.hcl

# Запуск сборки
packer build template.pkr.hcl

В процессе сборки Packer:

  1. Скачивает указанный ISO,
  2. Запускает виртуальную машину в VirtualBox,
  3. Устанавливает ОС (автоматически, через preseed-файл),
  4. Подключается по SSH и выполняет провижионинг,
  5. Выключает VM,
  6. Экспортирует готовый образ.

Продвинутые сценарии

Сборка для нескольких платформ одновременно

Один шаблон может описывать сборку для разных платформ параллельно:

source "amazon-ebs" "web" {
  ami_name      = "web-server-{{timestamp}}"
  instance_type = "t2.micro"
  region        = "us-west-2"
  source_ami    = "ami-12345678"
  ssh_username  = "ubuntu"
}

source "virtualbox-iso" "web" {
  # ... конфигурация для VirtualBox
}

build {
  sources = [
    "source.amazon-ebs.web",
    "source.virtualbox-iso.web"
  ]

  provisioner "shell" {
    inline = ["echo 'Building for all platforms!'"]
  }
}

Каскадная сборка (base-образы)

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


Packer vs альтернативы

ИнструментДля чегоКлючевое отличие от Packer
PackerСборка VM-образов и контейнеров для любых платформЕдиный шаблон → множество платформ
DockerСборка и запуск контейнеровОриентирован только на контейнеры, не умеет создавать VM-образы
AWS EC2 Image BuilderСборка AMI в AWSПривязан к экосистеме AWS, не работает с другими облаками
VagrantУправление средами разработкиСкорее оркестратор готовых образов, чем их сборщик

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


Заключение

Packer — это не просто очередной инструмент в арсенале DevOps. Это индустриальный пресс для штамповки инфраструктуры, превращающий хаотичный процесс ручной настройки серверов в предсказуемый, воспроизводимый и автоматизированный конвейер.

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



⚙️ Машинное отделение ROADIT благодарит за прочтение.
Больше команд, шпаргалок и обзоров — на roadit.ru и в нашем Телеграф-канале.
📋 Все команды


Оставьте комментарий