О Packer
Кратко:
- Packer - инструмент для создания образов ВМ, позволяющий переносить проекты из тестовой среды в рабочую.
- Готовые образы, доступные в маркетплейсе, содержат разные версии ОС или наборы программ, но не решают проблему масштабирования проекта.
- Packer от HashiCorp позволяет создавать образы с софтом, необходимым для конкретного проекта.
- Для создания образа с Ubuntu и веб-сервером NGINX можно использовать HCL или JSON.
- Создание образа с помощью Packer происходит через текстовый файл-спецификацию, описывающий сборку образа.
- Packer работает с Yandex Cloud, для работы с которым необходимо аутентифицироваться.
- Конфигурацию для создания образа можно сохранять в системе контроля версий для отслеживания изменений и откатов.
О Packer
В этом уроке речь пойдёт об инструменте Packer. Он позволяет удобно создавать образы ВМ.
Для чего нужны образы
Когда вы завершаете создавать проект, нужно перенести его из тестовой среды в рабочую. И тут перед вами встают две проблемы. Во-первых, чтобы решение гарантированно работало, рабочая среда должна как можно меньше отличаться от той, в которой проект создавался и тестировался. И во-вторых, проект нужно тиражировать, т. е. придётся много раз устанавливать и настраивать ПО на серверах или облачных платформах. Чтобы ускорить процесс и меньше ошибаться, лучшее решение — создать шаблон: образ ВМ с настроенным софтом.
Готовые образы, доступные в маркетплейсе, содержат только разные версии операционных систем или наборы программ. Такие образы не решают проблему быстрого масштабирования проекта. Образ с софтом, который нужен именно вам, как раз и можно создать с помощью Packer — продукта компании HashiCorp. Packer умеет создавать образы для разных платформ, в том числе Yandex Cloud.
Как создать образ при помощи Packer
Packer работает так: на входе вы даёте ему текстовый файл — спецификацию — с описанием сборки образа, а на выходе получаете готовый образ. Все просто!
Для примера давайте создадим образ с Ubuntu и веб-сервером NGINX. Описание образа можно составить на языке HCL (HashiCorp Language) или с помощью обычного JSON. Вариант с HCL более современный, так что рассмотрим именно его.
Если у вас есть готовые конфигурации в JSON, то их можно конвертировать в HCL с помощью команды packer hc2_upgrade.
Наш образ
my-ubuntu-nginx будет довольно простым. Для его создания достаточно такой спецификации:
source "yandex" "ubuntu-nginx" {
token = "<OAuth-токен>"
folder_id = "<идентификатор_каталога>"
source_image_family = "ubuntu-2004-lts"
ssh_username = "ubuntu"
use_ipv4_nat = "true"
image_description = "my custom ubuntu with nginx"
image_family = "ubuntu-2004-lts"
image_name = "my-ubuntu-nginx"
subnet_id = "<идентификатор подсети>"
disk_type = "network-ssd"
zone = "ru-central1-a"
}
build {
sources = ["source.yandex.ubuntu-nginx"]
provisioner "shell" {
inline = ["sudo apt-get update -y",
"sudo apt-get install -y nginx",
"sudo systemctl enable nginx.service"
]
}
}
В секции
source указывается, что собирать образ мы будем именно в Yandex Cloud. В документации Packer есть раздел с настройками, специфичными для Yandex Cloud.Packer должен аутентифицироваться в Yandex Cloud, чтобы создать образ от вашего имени. Есть несколько способов сделать это. В конфигурации выше, например, задан ключ
token. Еще один способ — записать IAM-токен или OAuth-токен в переменную окружения YC_TOKEN, тогда в самой спецификации можно дополнительно ничего не указывать.В параметре
image_name мы указываем имя образа.В секции
provisioner — команды, которые нужно выполнить при сборке образа. В нашем случае это установка NGINX.Сохраним конфигурацию в файл
my-ubuntu-nginx.pkr.hcl и попросим Packer на его основе создать образ ВМ:
packer build <путь_к_my-ubuntu-nginx.pkr.hcl>
Остальные параметры, которые можно использовать в спецификации, подробно разобраны в документации Packer.
Можно хранить спецификации для Packer (текстовые файлы) в системе контроля версий, а значит, можно отслеживать изменения, откатывать к более раннему состоянию, смотреть, кто и когда что-то поменял. Как мы уже говорили, такой подход называется Infrastructure as Code.