Creating a Vagrantfile
In this page we discuss how to create a Vagrantfile, which you can use to create new boxes. This content is specifically written to address the needs of MariaDB users.
A Basic Vagrantfile
A Vagrantfile is a Ruby file that instructs Vagrant to create one or more machines. Here is a simple example:
Vagrant.configure("2") do |config| config.vm.box = "hashicorp/bionic64" config.vm.provider "virtualbox" config.vm.provision :shell, path: "bootstrap.sh" end
Vagrant.configure("2") returns the Vagrant configuration object for the new box. In the block, we'll use the
config alias to refer this object. We are going to use the version 2 of Vagrant API.
vm.box is the base box that we are going to use. It is Ubuntu BionicBeaver (18.04 LTS), 64 bits version, provided by HashiCorp. The schema for box names is simple: the maintainer account in Vagrant Cloud followed by the box name.
vm.provision to specify the name of the file that is going to be executed at box creation, to provision the machine.
bootstrap.sh is the conventional name used in most cases.
A provider allows Vagrant to create a Vagrant machine using a certain technology. Different Providers may enable a virtual machine manager (VirtualBox, VMWare, Hyper-V...), a container manager (Docker), or remote cloud hosts (AWS, Google Compute Engine...).
Some providers are developed by third parties. app.vagrant.com supports search for boxes that support the most important third parties providers. To find out how to develop a new provider, see Plugin Development: Providers.
Provider options can be specified. Options affect the type of Vagrant machine that is created, like the number of virtual CPUs. Different providers support different options.
It is possible to specify multiple providers. In this case, Vagrant will try to use them in the order they appear in the Vagrantfile. It will try the first provider; if it is not available it will try the second; and so on.
Here is an example of providers usage:
Vagrant.configure("2") do |config| config.vm.box = "hashicorp/bionic64" config.vm.provider "virtualbox" do |vb| vb.customize ["modifyvm", :id, "--memory", 1024 * 4] end config.vm.provider "vmware_fusion" end
In this example, we try to use VirtualBox to create a virtual machine. We specify that this machine must have 4G of RAM (1024M * 4). If VirtualBox is not available, Vagrant will try to use VMWare.
This mechanism is useful for at least a couple of reasons:
- Different users may use different systems, and maybe they don't have the same virtualization technologies installed.
- We can gradually move from one provider to another. For a period of time, some users will have the new virtualization technology installed, and they will use it; other users will only have the old technology installed, but they will still be able to create machines with Vagrant.
We can use different methods for provisioning. The simplest provisioner is
shell, that allows to run a Bash file to provision a machine. Other provisioners allow to setup the machines using automation software, including Ansible, Puppet, Chef and Salt.
To find out how to develop a new provisioner, see Plugin Development: Provisioners.
boostrap.sh, in the example above, is simply a Bash file containing the shell commands to run to provision the box. A simple bootstrap.sh may look like the following:
#!/bin/bash apt-get update apt-get install -y
To find out the steps to install MariaDB on your system of choice, see the Getting, Installing, and Upgrading MariaDB section.
You may also want to restore a database backup in the new box. In this way, you can have the database needed by the application you are developing. To find out how to do it, see Backup and Restore Overview. The most flexible type of backups (meaning that it works between different MariaDB versions, and in some cases even between MariaDB and different DBMSs) is a dump.
powershell provisioner exists, too. It may be useful to provision Windows machines.
If we use the
shell provisioner, we need a way to upload files to the new machine when it is created. We could use the
file provisioner, but it works by connecting the machine via ssh, and the default user doesn't have permissions for any directory except for the synced folders. We could change the target directory owner, or we could add the default user to a group with the necessary privileges, but these are not considered good practices.
Instead, we can just put the file we need to upload somewhere in the synced folder, and then copy it with a shell command:
cp ./files/my.cnf /etc/mysql/conf.d/
Provisioning Vagrant with Ansible
Here is an example of how to provision a Vagrant box by running Ansible:
Vagrant.configure("2") do |config| ... config.vm.provision "ansible" do |ansible| ansible.playbook = "vagrant.yml" end end
Ansible runs in the host system. In this example, it runs a playbook called
For an introduction to Ansible for MariaDB users, see Ansible and MariaDB.
Provisioning Vagrant with Puppet
To provision a Vagrant box by running Puppet:
Vagrant.configure("2") do |config| ... config.vm.provision "puppet" do |puppet| puppet.manifests_path = "manifests" puppet.manifest_file = "default.pp" end end
In this example, Puppet Apply runs in the host system but not Puppet Server is needed. Puppet expects to find a
manifests directory in the project directory. It expects it to contain
default.pp, which will be used as an entry point. Note that
puppet.manifest_file are set to their default values.
Puppet needs to be installed in the guest machine.
To use a Puppet server, the
puppet_server provisioner can be used:
Vagrant.configure("2") do |config| ... config.vm.provision "puppet_server" do |puppet| puppet.puppet_server = "puppet.example.com" end end
For an introduction to Puppet for MariaDB users, see Puppet and MariaDB.
Sharing Files Between the Host System and a Box
To restore a backup into MariaDB, in most cases we need to be able to copy it from the host system to the box. We may also want to occasionally copy MariaDB logs from the box to the host system, to be able to investigate problems.
The project directory (the one that contains the Vagrantfile) by default is shared with the virtual machine and mapped to the
/vagrant directory (the synced folder). It is a good practice to put there all files that should be shared with the box when it is started. Those files should normally be versioned.
The synced folder can be changed. In the above example, we could simply add one line:
config.vm.synced_folder "/host/path", "/guest/path"
The synced folder can also be disabled:
config.vm.synced_folder '.', '/vagrant', disabled: true
Further information can be found in Vagrant documentation.
- Synced Folders
- Ansible Provisioner
- Puppet Apply Provisioner
- Puppet Agent Provisioner
Content initially contributed by Vettabase Ltd.