Snapshot workflow

vagrant up --no-provision
vagrant snapshot save vm-created-not-provisioned
vagrant ssh #validate for changes made by provisioner
vagrant provision
vagrant ssh #validate for changes made by provisioner
vagrant snapshot restore vm-created-not-provisioned --no-provision

Boxes

Create a local pre-provisioned box

Creating an already provisioned base box based on debian/jessie64.

Create a Vagrant file in your project folder

Vagrant file
Vagrant.configure("2") do |config|

  ###############
  # BOX / IMAGE #
  ###############
  config.vm.box = "debian/jessie64"

  # inline - run a script to update, upgrade and install pkg
  config.vm.provision :shell do |sh|
    sh.inline = "apt-get -qq update"
    sh.inline = "apt-get -qq upgrade"
    sh.inline = "apt-get -qq install python3 ssh sudo curl htop"
    sh.name = "shell-prov"
  end

  config.vm.provision :shell do |sh|
    sh.inline = "/usr/bin/python3 -V"
    sh.name = "shell-prov"
  end

  # disable default sync folder
  config.vm.synced_folder ".", "/vagrant", disabled: true

  ###########
  # NETWORK #
  ###########
  config.vm.network "private_network", ip: "192.168.70.100"

  ###############
  # VM SETTINGS #
  ###############

  config.vm.provider "virtualbox" do |vb|
      vb.cpus = "1"
      vb.memory = "1024"
  end

end
Note
All commands need to be run from the folder containing the Vagrant file

Start and provision the VM for the first time:

vagrant up

Create a custom box with the unique name custom.jessie64.box

vagrant package --output custom.jessie64.box

Optional: Move the custom box file to a dedicated folder outside of the project dir e.g.: /home/user/vagrant/boxes/custom.jessie64.box

Add the custom box to Vagrant

vagrant box add --name custom.jessie64.box file:///home/user/vagrant/boxes/custom.jessie64.box

List all installed vagrant boxes. The custom.jessie64.box should now be part of this.

vagrant box list
Follow @KacperBak