Vagrantfile 内の設定を別のYAMLファイルから読み込む

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スクリプトなのでロジックが書けますが、読みにくくなるので回避策があるならやめたほうがよい、と思いました。

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ