На этом уроке речь пойдёт об инструменте Packer. Он позволяет удобно создавать образы виртуальных машин (ВМ).
Для чего нужны образы
Когда вы завершаете создавать проект, нужно перенести его из тестовой среды в рабочую. И тут перед вами встают две проблемы. Во-первых, чтобы решение гарантированно работало, рабочая среда должна минимально отличаться от той, в которой проект создавался и тестировался. И во-вторых, проект нужно тиражировать, т. е. придётся много раз устанавливать и настраивать ПО на серверах или облачных платформах. Чтобы ускорить процесс и меньше ошибаться, лучшее решение — создать шаблон: образ ВМ с настроенным софтом.Готовые образы, доступные в маркетплейсах, содержат только разные версии операционных систем или наборы программ. Такие образы не решают проблему быстрого масштабирования проекта. Образ с софтом, который нужен именно вам, как раз можно создать с помощью Packer — продукта компании HashiCorp. Packer умеет создавать образы для разных платформ, в том числе Yandex.Cloud.
Как создать образ при помощи Packer
Packer работает так: на входе вы даёте ему текстовый файл — спецификацию — с описанием сборки образа, а на выходе получаете готовый образ. Все просто!Для примера давайте создадим образ с Ubuntu и веб-сервером nginx. Описание образа можно составить на языке HCL (HashiCorp Language) или с помощью обычного JSON. Вариант с HCL более современный, так что рассмотрим именно его.Если у вас есть готовые конфигурации в JSON, то их можно конвертировать в HCL с помощью команды packer hc2_upgrade.Наш образ будет довольно простым. Для его создания достаточно такой спецификации:
Скопировать код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.
Свежие комментарии