コンテンツにスキップ

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

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

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

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

# 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

config.vm.provision "file",
  source: "~/.ssh/id_rsa.pub",
  destination: "~/.ssh/authorized_keys"

config.vm.provision "file",
  source: "./configs/",
  destination: "/tmp/configs"

Ansible Provisioning

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

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

# 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

# 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

# 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

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

config.vm.provider "vmware_desktop" do|vmware|
  vmware.vmx["memsize"] = "4096"
  vmware.vmx["numvcpus"] = "4"
  vmware.vmx["displayName"] = "MyVM"
end

Hyper-V Provider

config.vm.provider "hyperv" do|hv|
  hv.memory = 4096
  hv.cpus = 4
  hv.vmname = "MyVM"
end

Synced Folders

Basic Synced Folders

# 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

config.vm.synced_folder "./", "/vagrant",
  type: "nfs",
  nfs_udp: false,
  nfs_version: 4

SMB Synced Folders (Windows)

config.vm.synced_folder "./", "/vagrant",
  type: "smb",
  smb_username: "username",
  smb_password: "password"

Best Practices

Performance Optimization

  1. Resource Allocation: Allocate appropriate CPU and memory
  2. Synced Folders: Use NFS for better performance on macOS/Linux
  3. Box Selection: Choose minimal base boxes
  4. Snapshot Management: Use snapshots for quick rollbacks
  5. Provider Optimization: Configure provider-specific optimizations

Security

  1. SSH Keys: Use SSH keys instead of passwords
  2. Network Isolation: Use private networks when possible
  3. Firewall: Configure appropriate firewall rules
  4. Updates: Keep boxes and Vagrant updated
  5. Secrets: Don't commit secrets to version control

Development Workflow

  1. Version Control: Include Vagrantfile in version control
  2. Documentation: Document setup and usage
  3. Consistency: Use same environment across team
  4. Testing: Test provisioning scripts
  5. Cleanup: Regularly clean up unused VMs and boxes

Troubleshooting

  1. Logs: Check Vagrant and provider logs
  2. SSH: Use vagrant ssh-config for debugging
  3. Networking: Test network connectivity
  4. Provisioning: Test provisioning scripts separately
  5. Resources: Monitor host system resources