Skip to main content

Implementing Backup and Recovery

1. Backing Up Vagrantfile Configuration

Configuration Description Example
Vagrantfile Primary configuration file for Vagrant environments
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/focal64"
end
Version Control Recommended practice to store Vagrantfile in version control systems (e.g., Git) git add Vagrantfile
Backup Location Store Vagrantfile in a secure location or cloud storage for recovery cp Vagrantfile /backup/location/

Example: Version Control Setup

git init
git add Vagrantfile
git commit -m "Initial Vagrant configuration"
Note: The Vagrantfile is the single source of truth for your environment, so backing it up ensures reproducibility.

2. Exporting VM State

Option Values Description
vagrant package vagrant package Exports the current VM state to a Vagrant box file
--output --output <file> Specifies the output file name for the package
--base --base <name> Exports a specific VM by name from the current environment

Example: Exporting a Vagrant Box

vagrant package --output myapp.box
Note: The exported box can be used to recreate the same VM state on another machine or shared with team members.

3. Saving Provisioning Scripts

Script Type Description Location Usage
shell Runs shell scripts on the guest machine /vagrant/scripts/provision.sh Used for setting up the environment, installing packages, and running commands
ansible Uses Ansible playbooks for provisioning /vagrant/playbooks/site.yml Best for complex configurations and multi-machine setups
chef Uses Chef recipes for configuration management /vagrant/chef/cookbooks/ Good for infrastructure as code and maintaining consistency across environments
puppet Uses Puppet manifests for configuration management /vagrant/puppet/manifests/site.pp Effective for managing large-scale deployments with complex dependencies

Example: Shell Script Provisioning

# /vagrant/scripts/provision.sh
#!/bin/bash

# Update system packages
apt-get update && apt-get upgrade -y

# Install Node.js and npm
curl -sL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs

# Install project dependencies
cd /vagrant
npm install

Example: Ansible Playbook Provisioning

# /vagrant/playbooks/site.yml
---
- hosts: all
  become: yes
  tasks:
    - name: Update apt cache
      apt:
        update_cache: yes

    - name: Install Node.js
      apt:
        name:
          - nodejs
          - npm
        state: present

    - name: Install project dependencies
      command: npm install
      args:
        chdir: /vagrant

4. Backing Up Synced Folder Data

Option Values Description
config.vm.synced_folder ["/host/path", "/guest/path"] Defines a synced folder between host and guest machine
type "virtualbox", "nfs", "rsync" Synced folder implementation type
disabled true, false Disables the synced folder if set to true

Example: Configure rsync for backup

Vagrant.configure("2") do |config|
  config.vm.synced_folder ".", "/vagrant", type: "rsync"
  config.vm.synced_folder "./backup", "/backup", type: "rsync"
end
Note: Rsync synced folders are ideal for backing up data because they can be configured to sync only changed files, minimizing bandwidth usage.
Warning: Ensure that the backup directory is not part of the synced folder to avoid recursive sync issues.

Backup Strategy Summary

  • Use rsync type for efficient incremental backups
  • Define separate synced folders for application and backup data
  • Regularly verify backup integrity using checksums or file counts

5. Documenting Custom Box Sources

Source Type Description Documentation Requirements Notes
Vagrant Cloud Official Vagrant box repository Include box name, version, and URL Boxes must be publicly accessible or properly authenticated
Local File Box file stored locally in project directory Document path and versioning strategy Use relative paths for portability
HTTP/HTTPS URL Publicly accessible box file via web URL Include full URL and checksum for verification Ensure URL stability and availability
Git Repository Box stored in Git with tags or branches Document repository URL and tag/branch reference Use semantic versioning for clarity

Example: Box Source Documentation

# Custom Box Sources

## Vagrant Cloud
- Name: example/centos7
- Version: 2.0.0
- URL: https://app.vagrantup.com/example/boxes/centos7

## Local File
- Path: ./boxes/centos7.box
- Version: 1.0.0

## HTTP URL
- URL: https://example.com/boxes/ubuntu2004.box
- Checksum: sha256:abc123...

## Git Repository
- Repo: https://github.com/example/boxes.git
- Tag: v1.0.0
Note: Ensure all custom box sources are documented in a centralized location such as README.md or a dedicated documentation file within the project.

6. Storing SSH Keys Securely

Option Values Notes
config.ssh.private_key_path ~/.ssh/id_rsa Path to the private SSH key file used for authentication
config.ssh.public_key_path ~/.ssh/id_rsa.pub Path to the public SSH key file used for authentication
config.ssh.insert_key true Whether to insert the private key into the guest VM

Example: Configure SSH Key Path

Vagrant.configure("2") do |config|
  config.ssh.private_key_path = "/home/user/.ssh/vagrant_key"
  config.ssh.public_key_path = "/home/user/.ssh/vagrant_key.pub"
end
Note: Ensure SSH keys are stored with appropriate permissions (e.g., chmod 600) to prevent unauthorized access.
Warning: Never commit SSH keys to version control systems like Git. Use environment variables or encrypted secrets in CI/CD pipelines.

7. Archiving Snapshot Data

Option Values Description
vagrant snapshot list vagrant snapshot list Lists all snapshots for the current VM
vagrant snapshot save vagrant snapshot save <name> Saves a new snapshot with the given name
vagrant snapshot restore vagrant snapshot restore <name> Restores the VM to a previous snapshot
vagrant snapshot delete vagrant snapshot delete <name> Deletes a specific snapshot

Example: Creating and Managing Snapshots

vagrant snapshot save "before-deployment"
vagrant snapshot list
vagrant snapshot restore "before-deployment"
Note: Snapshots are stored locally in the .vagrant directory and are not automatically archived or synced with remote systems.
Warning: Snapshots can consume significant disk space and should be managed carefully to avoid performance issues.

Snapshot Archiving Best Practices

  • Archive snapshots to external storage or cloud services for long-term retention
  • Use descriptive names for snapshots to easily identify their purpose
  • Delete unused snapshots to free up disk space
  • Regularly backup snapshot data to prevent data loss

8. Creating Recovery Procedures

Example: Basic Vagrant Recovery Script

#!/bin/bash
# recovery.sh - Basic Vagrant recovery script

echo "Starting Vagrant recovery procedure..."

# Check if Vagrant is installed
if ! command -v vagrant > /dev/null; then
  echo "Error: Vagrant is not installed."
  exit 1
fi

# Reload the Vagrant environment
vagrant reload

# Check status after reload
vagrant status

echo "Recovery procedure completed."
Step Action Description
1 vagrant reload Restarts the Vagrant environment, reapplying configuration.
2 vagrant status Verifies the state of the Vagrant environment after recovery.
3 vagrant provision Reapplies configuration management tools (e.g., Ansible, Puppet) if needed.
Note: Ensure that any custom Vagrant configuration or box changes are backed up before recovery procedures.
Warning: Recovery scripts should be tested in a non-production environment to avoid data loss or service disruption.

9. Testing Backup Restoration

Example: Restore Vagrant Box from Backup

vagrant box remove example/old-box
vagrant box add example/new-box /path/to/backup.box
vagrant up
Command Description Notes
vagrant box remove Removes a box from the local system Use with box name to delete
vagrant box add Adds a new box from file or URL Can restore from .box file backup
vagrant up Starts the Vagrant environment Restores VM from backed-up box
Note: Ensure the backup box file is compatible with current Vagrant version.
Warning: Testing restoration on a separate environment is recommended to avoid data loss.

10. Implementing Disaster Recovery Plan

Example: Vagrant Backup Script

#!/bin/bash
# Backup Vagrant VMs to tar.gz archives
BACKUP_DIR="/backups/vagrant"
DATE=$(date +%Y%m%d_%H%M%S)

for vm in $(vagrant status --machine-readable | grep state | cut -d',' -f2); do
  echo "Backing up VM: $vm"
  vagrant package --output "$BACKUP_DIR/$vm-$DATE.box"
done

echo "All VMs backed up to $BACKUP_DIR"
Component Description Notes
vagrant package Creates a box from a running VM Useful for backup and distribution
vagrant box list Lists all available boxes Check for existing backups before creating new ones
vagrant box remove Removes a specific box Use to clean up old or corrupted backups
Note: Ensure sufficient disk space before running backup scripts. Consider compressing backups with gzip for storage efficiency.

Disaster Recovery Approaches

  • Full VM Backup: Complete image backup using vagrant package
  • Snapshot-Based: Use provider-specific snapshots (e.g., VirtualBox snapshots)
  • Configuration-Driven: Rebuild from Vagrantfile and provisioners

Disaster Recovery Workflow

  1. Identify failed VMs using vagrant status
  2. Restore from latest backup box or snapshot
  3. Reprovision if necessary using vagrant provision
  4. Validate environment functionality

Was this article helpful?