Packer
Утилита для создания образов операционных систем Packer.
Содержание
1 Общая информация
- Сайт: https://www.packer.io/.
- Репозиторий: https://github.com/hashicorp/packer.
- Бинарные сборки: https://releases.hashicorp.com/packer (на данный момент не доступно из России).
- Зеркало бинарных сборок:
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
- Установка с помощью Chocolatey (см. Пакетный менеджер для Windows. Chocolatey):
1choco install packer
4 Скрипты развёртывания
- Ранее использовался язык описания JSON.
- После Packer-1.5 используется формат HCL2.
5 Плагины
- Ранее код плагинов был включён в packer.
- Сейчас их необходимо устанавливать отдельно.
5.1 Vagrant
- Документация: https://developer.hashicorp.com/packer/integrations/hashicorp/vagrant
- Репозиторий: https://github.com/hashicorp/packer-plugin-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
- Инициализируйте packer:
Можно установить из командной строки:
1packer plugins install github.com/hashicorp/vagrant
5.2 Virtualbox
- Репозиторий: https://github.com/hashicorp/packer-plugin-virtualbox
- Документация: https://developer.hashicorp.com/packer/integrations/hashicorp/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
- Инициализируйте packer:
Можно установить из командной строки:
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