Моя цель состояла в том, чтобы программно создать виртуальную машину, как если бы вы сделали контейнер с докером, и иметь возможность экспортировать ее в OVF.
Поэтому я использовал Vagrant для создания виртуальной машины. Комбинируя Vagrant и Packer, я нашел 3 способа добиться успеха.
У меня осталось два вопроса:
vagrant:vagrant
будут по-прежнему активны, и их нужно будет удалить позже, а пароль root будет изменен с vagrant
к чему-то более сильному. Есть ли способ сделать это с помощью Vagrant / Packer, чтобы не делать это вручную? Есть ли какие-то другие специфические вещи для Vagrant box, которые мне нужно очистить после сборки виртуальной машины?Ниже представлены 3 способа:
# 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
# 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"
}]
}
С этим методом у меня больше гибкости для вывода.
# 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"
}]
}