Vagrant の bridge にホストマシンのデフォルトルートの NIC を自動指定する

VirtualBox on OS X にて Vagrant で複数 VM を起動するとき、public_network を使っていると毎度ブリッジインタフェースの選択が面倒です。
各 VM の起動時に都度選択画面が出るので、全台起動するまでターミナルに張り付いていないといけません。

下記のように固定してしまっても良いのですが、ホストマシンが有線接続な時はそちらにブリッジしたいという欲もあります。

config.vm.network "public_network", bridge: 'en0: Wi-Fi (AirPort)'

そんなときは下記のように Vagrantfile 中に一文入れてしまえば良いです。
ありがたいことに、VBoxManage list bridgedifs は、ホストマシンのデフォルトルートのインタフェースを 1 番目に出力してくれるので、これを bridge オプションに入れるようにします。

Vagrant.configure(2) do |config|
  ...snip...

  # ホストマシンのデフォルトルートの NIC を取得
  bridge_if = %x(VBoxManage list bridgedifs | grep '^Name:' | head -n 1).chomp.sub(/^Name: +/, "")

  config.vm.define :web do |web|
    web.vm.network "private_network", ip: "172.16.0.101", netmask: "255.255.255.0"
    web.vm.network "public_network", bridge: bridge_if
  end

  config.vm.define :api do |api|
    api.vm.network "private_network", ip: "172.16.0.102", netmask: "255.255.255.0"
    api.vm.network "public_network", bridge: bridge_if
  end

  config.vm.define :db do |db|
    db.vm.network "private_network", ip: "172.16.0.103", netmask: "255.255.255.0"
    db.vm.network "public_network", bridge: bridge_if
  end
end

ちなみに、use_dhcp_assigned_default_route を書いておくと、VM のデフォルトルートが public_network になって何かと便利です。

config.vm.network "public_network", use_dhcp_assigned_default_route: true