0

О Packer

26.04.2022

На этом уроке речь пойдёт об инструменте 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.

Свежие комментарии

Подписка

Лучшие статьи


Fatal error: Uncaught Error: Call to a member function have_posts() on null in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php:380 Stack trace: #0 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/widget.php(257): fox56_blog_grid(NULL, Array) #1 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/register.php(33): include('/home/host18670...') #2 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/class-wp-widget.php(394): Wi_Widget_Latest_Posts->widget(Array, Array) #3 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/widgets.php(837): WP_Widget->display_callback(Array, Array) #4 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(417): dynamic_sidebar('sidebar') #5 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(136): fox56_single_sidebar() #6 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(7): fox56_single_inner() #7 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/single.php(23): fox56_single() #8 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/template-loader.php(106): include('/home/host18670...') #9 /home/host1867038/the-devops.ru/htdocs/www/wp-blog-header.php(19): require_once('/home/host18670...') #10 /home/host1867038/the-devops.ru/htdocs/www/index.php(17): require('/home/host18670...') #11 {main} thrown in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php on line 380