Vagrantチートシート

# synced_folderで`.git`を除外する

```ruby:Vagrantfile
config.vm.synced_folder ".", "/vagrant", type: "rsync", rsync__exclude: ".git/"
```

# 双方向に読み書きできるsynced folderをつくる

`type:"virtualbox"`をつけると双方向に読み書きできるsynced folderになる。
Guest Additionが必須。

```ruby:Vagrantfile
config.vm.synced_folder "./output", "/vagrant/output", type:"virtualbox"
```

以下のようにすると、`Vagrantfile`のあるディレクトリを通常のrsyncで同期しつつ、`output`ディレクトリだけ双方向で同期できる。
vagrantでビルド環境を構築するときなどに便利。

```ruby:Vagrantfile
config.vm.synced_folder "./", "/vagrant", type: "rsync", rsync__exclude: ".git/"
config.vm.synced_folder "./output", "/vagrant/output", type:"virtualbox"
```


# VMを再起動してプロビジョニングをやりなおす

```shell-session
$ vagrant reload --provision
```

# vagrantコマンドのサブコマンドを補完してほしい

```shell-session
$ brew install vagrant-completion
```

# boxのGuest Additionsのバージョンを上げる

```shell-session
$ vagrant plugin install vagrant-vbguest
```

destroyしてupすると自動的に新しいGuest Additionsをビルドするようになる。

https://qiita.com/isaoshimizu/items/e217008b8f6e79eccc85


# プライベートネットワークのゲスト同士が通信できない

`192.168.33.1`はホストのIPアドレスとして割り当てられているので、ゲストでこのアドレスを使用することができない。（設定はできてしまうし警告も出る）
ゲスト同士で疎通できないときはうっかり割り当てていないか確認する。


# VMのディスク容量を増やす

`vagrant-disksize`を入れる
↓
`vagrant up`
↓
`vagrant ssh`
↓
`parted`でパーティション容量を拡張する
↓
`resize2fsでファイルシステムを拡張する`


# `Stderr: VBoxManage: error: Cannot unregister the machine` とかいわれてdestroyできない

`VBoxHeadless`のプロセスをkillしてから`vagrant destroy`やりなおしたらよいっぽい。

https://l-w-i.net/t/vagrant/control_100.txt



# めも

```ruby
  config.vm.define "fakeroot" do |host|
    host.vm.hostname = "fakeroot"
    host.vm.network "private_network", ip: "192.168.56.254", netmask: "24"
    host.vm.provision "file", source: "./setup_gateway.sh", destination: "/tmp/"
    host.vm.provision "shell", inline: <<-SHELL
      chmod +x /tmp/setup_gateway.sh
      sudo /tmp/setup_gateway.sh fakeroot 10.50.0.1
      rm /etc/tinc/machikado_network/hosts/syamimomo
      sed -i -e '/ConnectTo = syamimomo/ d' /etc/tinc/machikado_network/tinc.conf
    SHELL
    host.trigger.after :up do |trigger|
      #trigger.run = {inline: "(vagrant ssh fakeroot -c 'cat /etc/tinc/machikado_network/hosts/fakeroot') > #{File.join(tmpdir, "fakeroot")} 2>/dev/null"}
      #trigger.run_remote = {inline: "uname -a"}
      trigger.ruby do |env, machine|
        machine.communicate.sudo("cat /etc/tinc/machikado_network/hosts/fakeroot | awk '/-----BEGIN RSA PUBLIC KEY-----/,/-----END RSA PUBLIC KEY-----/' | grep -v -e '-----BEGIN RSA PUBLIC KEY-----' -e '-----END RSA PUBLIC KEY-----' | tr -d '\r\n' | grep .") do |type, output|
          $store[:fakeroot_key] = output
        end
      end
    end
  end

  # まちかどネットワークゲートウェイの想定のVM
  config.vm.define "gateway" do |host|
    host.vm.hostname = "gateway"
    host.vm.network "private_network", ip: "192.168.56.2", netmask: "24"
    host.vm.network "private_network", ip: "192.168.57.2", netmask: "24"
    host.vm.provision "file", source: "./setup_gateway.sh", destination: "/tmp/"
    host.vm.provision "shell", inline: <<-SHELL
      chmod +x /tmp/setup_gateway.sh
      sudo /tmp/setup_gateway.sh gateway 10.50.0.2
    SHELL
    host.trigger.after :up do |trigger|
      trigger.run_remote = {inline: "echo '#{$store[:fakeroot_key]}' | fold "}
      trigger.ruby do |env, machine|
        k = $store[:fakeroot_key]
        k.scan(/.{1,64}/)
        #puts "gateway trigger.ruby: "
        #puts $store[:fakeroot]
        #machine.communicate.sudo("cat /etc/tinc/machikado_network/hosts/fakeroot") do |type, output|
        #  $store[:fakeroot] = output
        #end
      end
    end
  end
```