Быстрая сборка образов ОС с помощью Packer

в 11:49, , рубрики: devops, Packer, Блог компании Express 42, ит-инфраструктура, системное администрирование, метки: ,

Repetitio est mater studiorum
Старинная латинская пословица

Если вам периодически приходится собирать образы операционных систем на базе Linux для разных сред виртуализации или даже облаков, или, тем более, вы пользуетесь Vagrant, то вам стоит взглянуть на новый инструмент от Митчела Хашимото (это создатель Vagrant) — Packer.

Packer — это инструмент для создания одинаковых образов ОС для различных платформ из одного описания.

Достаточно давно Патрик Дебоиз (это человек, который придумал термин DevOps) написал Veewee — инструмент, который позволяет автоматически создавать образа для VirtualBox, KVM и VMWare.

Packer пошел дальше, и позволяет делать то же самое для распространенных облачных провайдеров: Amazon,DigitalOcean, OpenStack и GCE. Также Packer позволяет создавать контейнеры для Docker.

Сразу ответим на главный вопрос — зачем это может понадобиться. В последнее время активно обсуждается тема
неизменного сервера (Immutable Server). Мы даже посвятили ей выпуск подкаста Девопс Дефлопе. Дело в том, что все системы управления конфигурацией не позволяют до конца контролировать "одинаковость" различных машин. Тогда возникла идея создавать машины и никогда не менять их конфигурацию. А в случае необходимости — создавать их заново с новой конфигурацией.

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

Давайте сделаем образ с Ubuntu 12.04 для VirtualBox, чтобы посмотреть, насколько это просто.

Для начала, нам надо поставить VirtaulBox и packer версии старше 0.5.1. Уверен, этот шаг не вызовет затруднений.

Дальше необходимо создать файл конфигурации для packer, который должен выглядеть приблизительно так:

{
  "provisioners": [
    {
      "type": "shell",
      "scripts": [
        "scripts/postinstall.sh"
      ],
      "override": {
        "virtualbox-iso": {
          "execute_command": "echo 'vagrant'|sudo -S sh '{{.Path}}'"
        }
      }
    }
  ],
  "builders": [
    {
      "type": "virtualbox-iso",
      "boot_command": [
        "<esc><esc><enter><wait>",
        "/install/vmlinuz noapic preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg <wait>",
        "debian-installer=en_US auto locale=en_US kbd-chooser/method=us <wait>",
        "hostname=ubuntu <wait>",
        "fb=false debconf/frontend=noninteractive <wait>",
        "keyboard-configuration/modelcode=SKIP keyboard-configuration/layout=USA keyboard-configuration/variant=USA console-setup/ask_detect=false <wait>",
        "initrd=/install/initrd.gz -- <enter><wait>"
      ],
      "boot_wait": "4s",
      "disk_size": 51200,
      "guest_os_type": "Ubuntu_64",
      "http_directory": "http",
      "iso_checksum_type": "md5",
      "iso_url": "http://releases.ubuntu.com/precise/ubuntu-12.04.4-server-amd64.iso",
      "iso_checksum": "e83adb9af4ec0a039e6a5c6e145a34de",
      "ssh_username": "vagrant",
      "ssh_password": "vagrant",
      "ssh_port": 22,
      "http_directory" : ".",
      "http_port_min" : 9001,
      "http_port_max" : 9001,
      "ssh_wait_timeout": "10000s",
      "shutdown_command": "echo 'shutdown -P now' > shutdown.sh; echo 'vagrant'|sudo -S sh 'shutdown.sh'",
      "guest_additions_path": "VBoxGuestAdditions_{{.Version}}.iso",
      "virtualbox_version_file": ".vbox_version",
      "vboxmanage": [
        [
          "modifyvm",
          "{{.Name}}",
          "--memory",
          "512"
        ],
        [
          "modifyvm",
          "{{.Name}}",
          "--cpus",
          "1"
        ]
      ]
    }
  ],
  "post-processors": [
    "vagrant"
  ]
}

В нем написано, что мы берем стандартный образ Ubuntu (ключ iso_url), инсталлируем его, используя набор команд из preseed.cfg, а потом выполняем внутри скрипт postinstall.sh, который ставит chef и готовит бокс для работы с вагрантом. Приводить здесь все файлы не имеет смысла, проще посмотреть репозиторий на гитхабе (в нем все нужные файлы находятся в папке packer).

Далее выполняем команду packer build ubuntu64.json, и внимательно наблюдаем, как инсталятор в автоматическом режиме ставит Убунту.

Ставься Убунточка

Если все прошло успешно, то в результате у вас появится файл packer_virtualbox-iso_virtualbox.box — образ, который можно использовать в Vagrant.

Узнать больше про Vagrant можно в нашей предыдущей статье. А еще 15 марта, как всегда бесплатно, в офисе компании Parallels состоится очередная встреча сообщества DevOps Moscow, которая будет посвящена вагранту. Если вы зарегистрируетесь на meetup.com, то оповещения о новых встречах будут приходить к вам автоматически.

Импортируем наш свеженький бокс в Vagrant и инициализируем чистое Vagrant окружение.

vagrant box add from_packer packer_virtualbox-iso_virtualbox.box
cd ..
vagrant init

После этого мы поправим одну строчку в Vagrantfile, а именно config.vm.box = "from_packer" (все это есть в тестовом репозитории).

vagrant up
vagrant ssh
Welcome to Ubuntu 12.04.4 LTS (GNU/Linux 3.8.0-29-generic x86_64)

* Documentation:  https://help.ubuntu.com/
Last login: Sat Feb  8 18:01:24 2014 from 10.0.2.2
vagrant@ubuntu:~$

Итак, легко и просто, у нас появилась Убунта 12.04 с последними обновлениями и установленным самым свежим шефом.

С помощью нехитрых действий, скрипт postinstall.sh можно заменить на любой другой скрипт, а так же запуск chef-solo, puppet apply и много чего еще.

С использованием packer создание новых образов для различных сред превращается из сложной и муторной работы в простой и повторяемый процесс с предсказуемым результатом.

Для легкого старта компания Chef подготовила большое количество шаблонов packer для различных дистрибутивов Linux и назвала их bento.

Не стоит забывать, что действующие члены экипажа космического корабля «Экспресс 42» 22 и 23 марта высадятся у Злых Марсиан, чтобы промыть мозги всем желающим, а именно рассказать и показать, как использовать DevOps практики и инструменты в согласии с Великим Космосом.

Список статей по теме Packer на английском языке, которые показались мне интересными.

Автор: evtuhovich

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js