Vagrantfile 内の設定を別のYAMLファイルから読み込む
モスバーガーの豚汁にハマってるtanakaです。
今日はVagrantの設定をちょっとカスタマイズする方法を紹介します。
概要
Webアプリケーションフレームワークを使ったアプリだと1リクエストでも多数のファイルを読み込むことになるので、Vagrantの通常のフォルダ共有は開発中遅いです。 かといって、rsyncやPhpStormのSFTP機能だと、チームメンバーのサポートまでやるのはなかなか大変。
いままでは、synced_folderの記述をコメントアウトして、コミットしないよう注意してましたが、何度もコミットしてしまうミスがありました。
そこで、通常のフォルダ共有の設定にしつつ、リポジトリ管理しない外部ファイルで設定をオフにする、ということができないかやってみた結果、できました。
(この記事を書いているときにその目的を達成できるプラグイン(tcnksm/vagrant-secret)を見つけましたが、記事は公開します)
alt3/cakebox: Multi-Framework PHP Development Environment の .cakebox/Vagrantfile.rb
がそのような構成だったので知恵を拝借。
Vagrantfile
8行目から19行目で、デフォルト設定とYAMLファイルを読み込んでマージするコードを書いてます。 29行目で設定値をチェックしてます。
# -*- mode: ruby -*-
# vi: set ft=ruby :
require 'yaml'
require 'vagrant/util/deep_merge'
Vagrant.configure(2) do |config|
local_settings_file_path = File.dirname(__FILE__) + File::SEPARATOR + 'vagrant_config_local.yml'
# デフォルト設定
settings = Hash.new
settings["synced_folder_enable"] = true
# 外部設定ファイルがあれば読み込んでマージ
if File.exist?(local_settings_file_path)
local_settings = YAML::load(File.read(local_settings_file_path))
if local_settings == false
local_settings = Hash.new
end
settings = Vagrant::Util::DeepMerge.deep_merge(settings, local_settings)
end
# ここから通常のVagrant設定
Encoding.default_external = 'UTF-8'
config.vm.box = "ubuntu/wily64"
config.vm.box_check_update = false
WEB_SERVER_GID = 33
# vagrant_config_local.yml で使わない設定にすれば、synced_folderを使わない
if settings["synced_folder_enable"]
config.vm.synced_folder "src", "/var/www/application",
:nfs => false,
:owner => "vagrant",
:group => WEB_SERVER_GID,
:mount_options => ["dmode=775,fmode=775"]
end
end
vagrant_config_local.yml
synced_folder_enable: false
オチ
Vagrantfile はRubyスクリプトなのでロジックが書けますが、読みにくくなるので回避策があるならやめたほうがよい、と思いました。