Назад | Перейти на главную страницу

Как лучше всего экспортировать коробку Vagrant в OVF?

Моя цель состояла в том, чтобы программно создать виртуальную машину, как если бы вы сделали контейнер с докером, и иметь возможность экспортировать ее в OVF.

Поэтому я использовал Vagrant для создания виртуальной машины. Комбинируя Vagrant и Packer, я нашел 3 способа добиться успеха.

У меня осталось два вопроса:

  1. В чем разница между 3 методами, показанными ниже? Или какой из них лучший и почему?
  2. Пользователь vagrant:vagrant будут по-прежнему активны, и их нужно будет удалить позже, а пароль root будет изменен с vagrant к чему-то более сильному. Есть ли способ сделать это с помощью Vagrant / Packer, чтобы не делать это вручную? Есть ли какие-то другие специфические вещи для Vagrant box, которые мне нужно очистить после сборки виртуальной машины?

Ниже представлены 3 способа:

Базовый блок> Vagrant Provisioning> Пакет как базовый блок OVF

# Starts and provisions the vagrant environment
$ vagrant up

# Stops the vagrant machine
$ vagrant halt

# List VMs
$ vboxmanage list vms

# Package a vagrant box to a base box and so creating an OVF
$ vagrant package --base <VM_name> --output package.tar.gz

С Vagrantfile:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure('2') do |config|
  config.vm.box = 'archlinux/archlinux'
  config.vm.hostname = 'myhostname'
  config.vm.provision :shell, path: 'bootstrap.sh'
end

Базовое окно> Vagrant Provisioning> Packer virtualbox-vm с экспортом

# Starts and provisions the vagrant environment
$ vagrant up

# Stops the vagrant machine
$ vagrant halt

# List VMs
$ vboxmanage list vms

# Export to OVF
$ packer build packer.json

С Vagrantfile:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure('2') do |config|
  config.vm.box = 'archlinux/archlinux'
  config.vm.hostname = 'myhostname'
  config.vm.provision :shell, path: 'bootstrap.sh'
end

С packer.json:

{
  "builders": [{
    "type"                  : "virtualbox-vm",
    "communicator"          : "ssh",
    "headless"              : "true",
    "ssh_username"          : "vagrant",
    "ssh_password"          : "vagrant",
    "ssh_wait_timeout"      : "30s",
    "shutdown_command"      : "echo 'packer' | sudo -S shutdown -P now",
    "guest_additions_mode"  : "disable",
    "output_directory"      : "./builds-vm",
    "vm_name"               : "<vm_name>",
    "attach_snapshot"       : null,
    "target_snapshot"       : null,
    "force_delete_snapshot" : "false",
    "keep_registered"       : "false",
    "skip_export"           : "false"
  }]
}

С этим методом у меня больше гибкости для вывода.

Базовый бокс OVF> Packer virtualbox-ovf builder с подготовкой + экспорт

# Download vagrant base box
$ vagrant box add archlinux/archlinux --provider virtualbox

# Provisions and exports to OVF
packer build packer.json

С packer.json:

{
  "builders": [{
    "type"                  : "virtualbox-ovf",
    "source_path"           : "/home/noraj/.vagrant.d/boxes/archlinux-VAGRANTSLASH-archlinux/2020.04.02/virtualbox/box.ovf",
    "communicator"          : "ssh",
    "headless"              : "true",
    "ssh_username"          : "vagrant",
    "ssh_password"          : "vagrant",
    "shutdown_command"      : "echo 'packer' | sudo -S shutdown -P now",
    "skip_export"           : "false",
    "output_directory"      : "packer-export"
  }],
  "provisioners": [{
    "type": "shell",
    "script": "bootstrap.sh"
  }]
}