Appearance
Vagrant
Comprehensive HashiCorp Vagrant commands and workflows for development environment management and virtual machine provisioning.
Installation & Setup
Command | Description |
---|---|
vagrant version | Show Vagrant version |
vagrant -h | Show help information |
vagrant init | Initialize new Vagrantfile |
vagrant init ubuntu/jammy64 | Initialize with specific box |
Box Management
Box Operations
Command | Description |
---|---|
vagrant box list | List installed boxes |
vagrant box add ubuntu/jammy64 | Add box |
vagrant box add --name mybox /path/to/box.box | Add local box |
vagrant box remove ubuntu/jammy64 | Remove box |
vagrant box update | Update all boxes |
vagrant box update --box ubuntu/jammy64 | Update specific box |
Box Information
Command | Description |
---|---|
vagrant box outdated | Check for outdated boxes |
vagrant box prune | Remove old box versions |
vagrant box repackage ubuntu/jammy64 | Repackage box |
VM Lifecycle Management
Basic Operations
Command | Description |
---|---|
vagrant up | Start and provision VM |
vagrant halt | Shutdown VM |
vagrant reload | Restart VM |
vagrant destroy | Destroy VM |
vagrant suspend | Suspend VM |
vagrant resume | Resume suspended VM |
VM Status and Information
Command | Description |
---|---|
vagrant status | Show VM status |
vagrant global-status | Show all VMs status |
vagrant global-status --prune | Clean up invalid entries |
SSH and Access
SSH Operations
Command | Description |
---|---|
vagrant ssh | SSH into VM |
vagrant ssh-config | Show SSH configuration |
vagrant ssh -- -L 8080:localhost:80 | SSH with port forwarding |
Provisioning
Provisioning Commands
Command | Description |
---|---|
vagrant provision | Run provisioners |
vagrant provision --provision-with shell | Run specific provisioner |
vagrant up --provision | Start and provision |
vagrant reload --provision | Restart and provision |
Multi-Machine Environments
Multi-Machine Commands
Command | Description |
---|---|
vagrant up web | Start specific machine |
vagrant ssh web | SSH to specific machine |
vagrant halt db | Halt specific machine |
vagrant destroy --force | Destroy all without confirmation |
Snapshots
Snapshot Management
Command | Description |
---|---|
vagrant snapshot save snapshot_name | Save snapshot |
vagrant snapshot list | List snapshots |
vagrant snapshot restore snapshot_name | Restore snapshot |
vagrant snapshot delete snapshot_name | Delete snapshot |
Plugin Management
Plugin Operations
Command | Description |
---|---|
vagrant plugin list | List installed plugins |
vagrant plugin install vagrant-vbguest | Install plugin |
vagrant plugin uninstall vagrant-vbguest | Uninstall plugin |
vagrant plugin update | Update all plugins |
Vagrantfile Examples
Basic Vagrantfile
ruby
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/jammy64"
config.vm.hostname = "myserver"
# Network configuration
config.vm.network "private_network", ip: "192.168.56.10"
config.vm.network "forwarded_port", guest: 80, host: 8080
# Provider configuration
config.vm.provider "virtualbox" do |vb|
vb.memory = "2048"
vb.cpus = 2
vb.name = "MyVM"
end
# Provisioning
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y nginx
systemctl enable nginx
systemctl start nginx
SHELL
end
Multi-Machine Setup
ruby
Vagrant.configure("2") do |config|
# Web server
config.vm.define "web" do |web|
web.vm.box = "ubuntu/jammy64"
web.vm.hostname = "web"
web.vm.network "private_network", ip: "192.168.56.10"
web.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
vb.cpus = 1
end
web.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y nginx
SHELL
end
# Database server
config.vm.define "db" do |db|
db.vm.box = "ubuntu/jammy64"
db.vm.hostname = "database"
db.vm.network "private_network", ip: "192.168.56.11"
db.vm.provider "virtualbox" do |vb|
vb.memory = "2048"
vb.cpus = 2
end
db.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y mysql-server
SHELL
end
end
Advanced Configuration
ruby
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/jammy64"
config.vm.box_version = "20230607.0.0"
# Synced folders
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.synced_folder "./app", "/var/www/html",
owner: "www-data", group: "www-data"
# Network configuration
config.vm.network "private_network",
ip: "192.168.56.10",
netmask: "255.255.255.0"
config.vm.network "public_network",
bridge: "en0: Wi-Fi (AirPort)"
# Port forwarding
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "forwarded_port", guest: 443, host: 8443
# Provider-specific configuration
config.vm.provider "virtualbox" do |vb|
vb.gui = false
vb.memory = "4096"
vb.cpus = 4
vb.name = "Development Server"
# VirtualBox specific settings
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
end
# Multiple provisioners
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get upgrade -y
SHELL
config.vm.provision "file",
source: "./configs/nginx.conf",
destination: "/tmp/nginx.conf"
config.vm.provision "shell", path: "scripts/setup.sh"
config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook.yml"
ansible.inventory_path = "inventory"
end
end
Provisioning Methods
Shell Provisioning
ruby
# Inline shell commands
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y docker.io
usermod -aG docker vagrant
SHELL
# External script
config.vm.provision "shell", path: "scripts/bootstrap.sh"
# Privileged and non-privileged
config.vm.provision "shell", privileged: false, inline: <<-SHELL
echo "Running as vagrant user"
SHELL
# Environment variables
config.vm.provision "shell", env: {"DEBIAN_FRONTEND" => "noninteractive"}, inline: <<-SHELL
apt-get install -y mysql-server
SHELL
File Provisioning
ruby
config.vm.provision "file",
source: "~/.ssh/id_rsa.pub",
destination: "~/.ssh/authorized_keys"
config.vm.provision "file",
source: "./configs/",
destination: "/tmp/configs"
Ansible Provisioning
ruby
config.vm.provision "ansible" do |ansible|
ansible.playbook = "site.yml"
ansible.inventory_path = "inventory/vagrant"
ansible.limit = "all"
ansible.verbose = "v"
ansible.extra_vars = {
nginx_port: 80,
database_name: "myapp"
}
end
Docker Provisioning
ruby
config.vm.provision "docker" do |d|
d.pull_images "nginx"
d.pull_images "mysql:8.0"
d.run "nginx",
args: "-p 80:80 -v /vagrant/html:/usr/share/nginx/html"
d.run "mysql",
args: "-e MYSQL_ROOT_PASSWORD=secret -p 3306:3306"
end
Network Configuration
Private Networks
ruby
# Static IP
config.vm.network "private_network", ip: "192.168.56.10"
# DHCP
config.vm.network "private_network", type: "dhcp"
# Multiple interfaces
config.vm.network "private_network", ip: "192.168.56.10"
config.vm.network "private_network", ip: "10.0.0.10"
Public Networks
ruby
# Bridge to default interface
config.vm.network "public_network"
# Bridge to specific interface
config.vm.network "public_network", bridge: "en0: Wi-Fi (AirPort)"
# Static IP on public network
config.vm.network "public_network", ip: "192.168.1.100"
Port Forwarding
ruby
# Basic port forwarding
config.vm.network "forwarded_port", guest: 80, host: 8080
# Multiple ports
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "forwarded_port", guest: 443, host: 8443
config.vm.network "forwarded_port", guest: 3306, host: 3306
# Auto-correct port conflicts
config.vm.network "forwarded_port", guest: 80, host: 8080, auto_correct: true
Provider Configuration
VirtualBox Provider
ruby
config.vm.provider "virtualbox" do |vb|
vb.gui = true
vb.memory = "4096"
vb.cpus = 4
vb.name = "MyVM"
# Advanced settings
vb.customize ["modifyvm", :id, "--vram", "128"]
vb.customize ["modifyvm", :id, "--accelerate3d", "on"]
vb.customize ["modifyvm", :id, "--clipboard", "bidirectional"]
end
VMware Provider
ruby
config.vm.provider "vmware_desktop" do |vmware|
vmware.vmx["memsize"] = "4096"
vmware.vmx["numvcpus"] = "4"
vmware.vmx["displayName"] = "MyVM"
end
Hyper-V Provider
ruby
config.vm.provider "hyperv" do |hv|
hv.memory = 4096
hv.cpus = 4
hv.vmname = "MyVM"
end
Synced Folders
Basic Synced Folders
ruby
# Default synced folder (disabled)
config.vm.synced_folder ".", "/vagrant", disabled: true
# Custom synced folder
config.vm.synced_folder "./src", "/var/www/html"
# With options
config.vm.synced_folder "./app", "/var/www/html",
owner: "www-data",
group: "www-data",
mount_options: ["dmode=775,fmode=664"]
NFS Synced Folders
ruby
config.vm.synced_folder "./", "/vagrant",
type: "nfs",
nfs_udp: false,
nfs_version: 4
SMB Synced Folders (Windows)
ruby
config.vm.synced_folder "./", "/vagrant",
type: "smb",
smb_username: "username",
smb_password: "password"
Best Practices
Performance Optimization
- Resource Allocation: Allocate appropriate CPU and memory
- Synced Folders: Use NFS for better performance on macOS/Linux
- Box Selection: Choose minimal base boxes
- Snapshot Management: Use snapshots for quick rollbacks
- Provider Optimization: Configure provider-specific optimizations
Security
- SSH Keys: Use SSH keys instead of passwords
- Network Isolation: Use private networks when possible
- Firewall: Configure appropriate firewall rules
- Updates: Keep boxes and Vagrant updated
- Secrets: Don't commit secrets to version control
Development Workflow
- Version Control: Include Vagrantfile in version control
- Documentation: Document setup and usage
- Consistency: Use same environment across team
- Testing: Test provisioning scripts
- Cleanup: Regularly clean up unused VMs and boxes
Troubleshooting
- Logs: Check Vagrant and provider logs
- SSH: Use
vagrant ssh-config
for debugging - Networking: Test network connectivity
- Provisioning: Test provisioning scripts separately
- Resources: Monitor host system resources