Packer

Утилита для создания образов операционных систем Packer.

Содержание

1 Общая информация

1.1 Лицензия

2 Необходимое программное обеспечение

2.1 Virtualbox

  • Система виртуализации VirtualBox
  • Необходимо для создания образов для VirtualBox.
  • Особенности: Использование драйверов под операционную систему (VBoxGuestAdditions)

2.2 VmWare

  • Необходимо для создания образов для Vmware.

2.3 VMware open-vm-tools

  • Необходимо для создания образов для Vmware.
  • Предоставляет набор утилит и драйверов виртуализации с открытым исходным кодом для улучшения функциональности и удобства виртуализации в рамках виртуализации VMware.
  • Репозиторий: https://github.com/vmware/open-vm-tools
  • Сайт: https://sourceforge.net/projects/open-vm-tools/

3 Установка

3.1 Linux

  • Gentoo:
    1emerge dev-util/packer
    

3.2 Windows

4 Скрипты развёртывания

  • Ранее использовался язык описания JSON.
  • После Packer-1.5 используется формат HCL2.

5 Плагины

  • Ранее код плагинов был включён в packer.
  • Сейчас их необходимо устанавливать отдельно.

5.1 Vagrant

5.1.1 Установка

  • Добавьте код в конфигурацию packer

    1packer {
    2  required_plugins {
    3    vagrant = {
    4      version = "~> 1"
    5      source = "github.com/hashicorp/vagrant"
    6    }
    7  }
    8}
    
    • Инициализируйте packer:
      1packer init
      
  • Можно установить из командной строки:

    1packer plugins install github.com/hashicorp/vagrant
    

5.2 Virtualbox

5.2.1 Установка

  • Добавьте код в конфигурацию packer

    1packer {
    2  required_plugins {
    3    virtualbox = {
    4      version = "~> 1"
    5      source  = "github.com/hashicorp/virtualbox"
    6    }
    7  }
    8}
    
    • Инициализируйте packer:
      1packer init
      
  • Можно установить из командной строки:

    1packer plugins install github.com/hashicorp/virtualbox
    

5.2.2 Компоненты

  • Плагин поставляется с несколькими сборщиками, способными создавать VirtualBox:
    • virtualbox-iso:
      • запускается с ISO файла,
      • создаёт новую виртуальную машину VirtualBox,
      • устанавливает ОС,
      • подготавливает программное обеспечение в ОС,
      • экспортирует эту машину для создания образа.
    • virtualbox-ovf:
      • импортирует существующий файл OVF/OVA;
      • запускает средства подготовки поверх этой виртуальной машины;
      • экспортирует машину для создания образа.
    • virtualbox-vm:
      • использует существующую виртуальную машину для запуска определённых поставщиков поверх этой виртуальной машины;
      • при необходимости, создает снимок для сохранения изменений, внесенных поставщиками услуг;
      • может экспортировать эту машину для создания образа.

6 Примеры скриптов развёртывания

6.1 Установка Rocky Linux 9.4

  • Скрипт vagrant-rocky.pkr.hcl:
      1packer {
      2  required_plugins {
      3    vagrant = {
      4      source  = "github.com/hashicorp/vagrant"
      5      version = "~> 1"
      6    }
      7    virtualbox = {
      8      version = "~> 1"
      9      source  = "github.com/hashicorp/virtualbox"
     10    }
     11  }
     12}
     13
     14variable "artifact_description" {
     15  type    = string
     16  default = "Rocky 9.4"
     17}
     18
     19variable "artifact_version" {
     20  type    = string
     21  default = "9.4"
     22}
     23
     24variable "disk_size" {
     25  type    = string
     26  default = "61440"
     27}
     28
     29variable "iso_checksum" {
     30  type    = string
     31  default = "ee3ac97fdffab58652421941599902012179c37535aece76824673105169c4a2"
     32}
     33
     34variable "iso_checksum_type" {
     35  type    = string
     36  default = "sha256"
     37}
     38
     39variable "iso_url" {
     40  type    = string
     41  default = "Rocky-9.4-x86_64-minimal.iso"
     42}
     43
     44variable "redhat_platform" {
     45  type    = string
     46  default = "x86_64"
     47}
     48
     49variable "redhat_release" {
     50  type    = string
     51  default = "9"
     52}
     53
     54variable "ssh_password" {
     55  type    = string
     56  default = "vagrant"
     57}
     58
     59variable "ssh_username" {
     60  type    = string
     61  default = "vagrant"
     62}
     63
     64source "virtualbox-iso" "virtualbox" {
     65  boot_command            = [
     66    "<esc>",
     67    "<wait><esc><esc>",
     68    "linux inst.ks=http://{{.HTTPIP}}:{{.HTTPPort}}/ks.cfg biosdevname=0 net.ifnames=0",
     69    "<enter>"
     70  ]
     71  boot_wait               = "30s"
     72  disk_size               = "${var.disk_size}"
     73  export_opts             = [
     74    "--manifest",
     75    "--vsys", "0",
     76    "--description", "${var.artifact_description}",
     77    "--version", "${var.artifact_version}"
     78  ]
     79  guest_additions_path    = "VBoxGuestAdditions.iso"
     80  guest_os_type           = "RedHat_64"
     81  hard_drive_interface    = "sata"
     82  http_directory          = "${path.root}/http"
     83  iso_checksum            = "${var.iso_checksum_type}:${var.iso_checksum}"
     84  iso_url                 = "${var.iso_url}"
     85  output_directory        = "builds"
     86  shutdown_command        = "sudo -S /sbin/halt -h -p"
     87  shutdown_timeout        = "5m"
     88  ssh_password            = "${var.ssh_password}"
     89  ssh_username            = "${var.ssh_username}"
     90  ssh_port                = 22
     91  ssh_pty                 = true
     92  ssh_timeout             = "60m"
     93  vboxmanage              = [
     94    ["modifyvm", "{{.Name}}", "--memory", "2048"],
     95    ["modifyvm", "{{.Name}}", "--cpus", "2"],
     96    ["modifyvm", "{{.Name}}", "--nat-localhostreachable1", "on"]
     97  ]
     98  virtualbox_version_file = ".vbox_version"
     99  vm_name                 = "packer-rocky-virtualbox-vm"
    100}
    101
    102build {
    103  sources = ["source.virtualbox-iso.virtualbox"]
    104
    105  provisioner "shell" {
    106    execute_command = "echo 'packer'|{{ .Vars }} sudo -S -E bash '{{ .Path }}'"
    107    inline          = [
    108      "sleep 30",
    109      "sudo dnf -y install epel-release",
    110      "sudo dnf -y groupinstall 'Development Tools'",
    111      "sudo dnf -y install kernel-devel",
    112      "sudo dnf -y install dkms",
    113      "sudo mkdir /tmp/vboxguest",
    114      "sudo mount -t iso9660 -o loop /home/vagrant/VBoxGuestAdditions.iso /tmp/vboxguest",
    115      "cd /tmp/vboxguest",
    116      "sudo ./VBoxLinuxAdditions.run",
    117      "cd /tmp",
    118      "sudo umount /tmp/vboxguest",
    119      "sudo rmdir /tmp/vboxguest",
    120      "rm /home/vagrant/VBoxGuestAdditions.iso",
    121      "sudo systemctl enable --now vboxadd.service",
    122      "sudo dnf -y install lightdm",
    123      "sudo dnf -y groupinstall 'Server with GUI'",
    124      "sudo dnf install -y mc htop tmux",
    125      "sudo systemctl set-default graphical.target",
    126      "echo Image Provisioned!"
    127    ]
    128  }
    129
    130  post-processor "vagrant" {
    131    compression_level = "6"
    132    output            = "vagrant-virtualbox-rocky-${var.redhat_release}-${var.redhat_platform}.box"
    133  }
    134}
    
  • Makefile для Virtualbox:
     1.PHONY: version
     2
     3all: help
     4
     5init: ## Install missing plugins for packer
     6        @mkdir -p ""`pwd`"/.config/packer/plugins"
     7        @export PACKER_CONFIG_DIR=""`pwd`"/.config/packer"; export PACKER_PLUGIN_PATH=""`pwd`"/.config/packer/plugins"; packer init vagrant-rocky.pkr.hcl
     8
     9box:	init    ## Build box for Rocky Linux
    10        -@VBoxManage setproperty language C
    11        @VBoxManage setproperty machinefolder "`pwd`"/vm
    12        @export TMPDIR=""`pwd`""; export PACKER_CONFIG_DIR=""`pwd`"/.config/packer"; export PACKER_PLUGIN_PATH=""`pwd`"/.config/packer/plugins"; packer build -only=virtualbox-iso.virtualbox vagrant-rocky.pkr.hcl
    13        @VBoxManage setproperty machinefolder default
    14
    15help:
    16        @echo 'Usage:'
    17        @echo '  make <target>'
    18        @echo
    19        @echo 'Targets:'
    20        @grep -E '^[a-zA-Z_0-9.-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "  \033[36m%-30s\033[0m %s\n", $$1, $$2}'
    21        @echo
    
  • Makefile для Vmware:
     1.PHONY: version
     2
     3all: init box
     4
     5init: ## Install missing plugins for packer
     6        @packer init vagrant-rocky.pkr.hcl
     7
     8box:    ## Build box for Rocky Linux
     9        @export TMPDIR=`pwd`; export LANG=C; packer build -only=vmware-iso.vmware vagrant-rocky.pkr.hcl
    10
    11help:
    12        @echo 'Usage:'
    13        @echo '  make <target>'
    14        @echo
    15        @echo 'Targets:'
    16        @grep -E '^[a-zA-Z_0-9.-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "  \033[36m%-30s\033[0m %s\n", $$1, $$2}'
    17        @echo
    

Дмитрий Сергеевич Кулябов
Дмитрий Сергеевич Кулябов
Профессор кафедры теории вероятностей и кибербезопасности

Мои научные интересы включают физику, администрирование Unix и сетей.

Похожие