Caution
FreeBSD 14.0-RELEASE onwards is failing to build on VirtualBox.
This repository contains the necessary tools to build a Vagrant-ready FreeBSD virtual machine using Packer.
Tip
There are official FreeBSD VMs available from the Vagrant Cloud.
To create a box:
-
Clone this repository:
$ git clone https://github.com/jlduran/packer-FreeBSD.git $ cd packer-FreeBSD
-
Initialize packer:
$ packer init . -
Build the box (
virtualbox-iso.freebsdorqemu.freebsd):$ packer build -only=virtualbox-iso.freebsd . -
Add it to the list of Vagrant boxes. See Handling
.isoand.boxfiles for more information.$ vagrant box add builds/FreeBSD-14.3-RELEASE-amd64.box --name FreeBSD-14.3-RELEASE-amd64
servers = [
{ name: 'www.local', cpus: 2, memory: 1024 },
{ name: 'db.local', cpus: 1, memory: 2048 }
]
script = <<-SCRIPT
sed -i '' "s/Vagrant/$(hostname -s)/g" /usr/local/etc/mDNSResponderServices.conf
service mdnsresponderposix restart
SCRIPT
ansible_raw_arguments = []
Vagrant.configure(2) do |config|
servers.each do |server|
config.vm.define server[:name] do |box|
box.vm.box = 'FreeBSD-14.3-RELEASE-amd64'
box.vm.hostname = server[:name]
box.vm.provider 'virtualbox' do |v|
v.default_nic_type = 'virtio'
v.linked_clone = true
v.name, v.cpus, v.memory = server.values_at(:name, :cpus, :memory)
end
if server == servers.last
box.vm.provision 'ansible' do |ansible|
ansible.compatibility_mode = '2.0'
ansible.limit = 'all'
ansible.playbook = 'site.yml'
ansible.inventory_path = 'local'
ansible.raw_arguments = ansible_raw_arguments
end
else
ansible_raw_arguments << private_key_path(server[:name])
end
end
end
config.vm.provision 'shell', inline: script
end
def private_key_path(server_name)
provider = ENV['VAGRANT_DEFAULT_PROVIDER'] || 'virtualbox'
vagrant_dotfile_path = ENV['VAGRANT_DOTFILE_PATH'] || '.vagrant'
"--private-key=#{vagrant_dotfile_path}/machines/#{server_name}/" \
"#{provider}/private_key"
endBelow is a sample variables.pkrvars.hcl file:
arch = "amd64"
branch = "RELEASE"
build_date = ""
cpus = 1
directory = "releases"
disk_size = 10240
filesystem = "zfs"
zfs_compression = "zstd"
git_commit = ""
guest_os_type = "FreeBSD_64"
memory = 1024
mirror = "https://download.freebsd.org"
rc_conf_file = ""
revision = "14.3"The following variables can be set:
-
cpusis the number of CPUs assigned. Default:1 -
disk_sizeis the HDD size in megabytes. Default:10240 -
memoryis the amount of RAM in megabytes assigned. Default:1024 -
revisionis the FreeBSD revision number. Default:14.3 -
branchused in conjunction withbuild_date,git_commitanddirectory. Default:RELEASESee FreeBSD's Release Branches for more information. Possible values are:
Branch Directory CURRENTsnapshotsSTABLEsnapshotsALPHA1,ALPHA2, …snapshotsPRERELEASEsnapshotsBETA1,BETA2, …releasesRC1,RC2, …releasesRELEASEreleases -
archis the target architecture (i386oramd64). Default:amd64 -
guest_os_type(VirtualBox) used in conjunction witharch(FreeBSDorFreeBSD_64). See packer's documentation. Default:FreeBSD_64 -
filesystemis the file system type (ufsorzfs). Default:zfs -
zfs_compressionis the ZFS compression algorithm (zstdorlz4). Default:zstd -
mirroris the preferred FreeBSD mirror. Default:https://download.freebsd.org -
rc_conf_fileis the file whererc.confparameters are stored. Default: empty . Possible values are:Value File /etc/rc.conflocal/etc/rc.conf.local(Its use is discouraged)vendor/etc/defaults/vendor.confname(/usr/local)/etc/rc.conf.d/<name>
Create a variables.pkrvars.hcl file overriding the default
values, and invoke:
$ packer build -var-file="variables.pkrvars.hcl" .You can also select which components you wish to install. By default, it runs the following provisioning scripts:
| Name | Description |
|---|---|
update |
Updates to the latest patch level (if applicable) and the latest packages |
vagrant |
Vagrant-related configuration |
zeroconf |
Enables zero-configuration networking |
ansible |
Installs python and CA Root certificates |
vmtools |
Virtual Machine-specific utilities |
cleanup |
Cleanup script (must be called last) |
The following scripts are also available:
| Name | Description |
|---|---|
cloud-init |
Installs cloud-init |
hardening |
Provides basic hardening options |
ports |
Installs the FreeBSD ports tree |
Packer will automatically download the .iso image if it does not find
the right one under the iso directory. Optionally, you can download
the .iso image and save it to the iso directory.
.box files will be created under the builds directory.