Featured image of post Vagrantfileを共有する際に、実行する環境に依存するのものをどうするか?

Vagrantfileを共有する際に、実行する環境に依存するのものをどうするか?

Twitter ツイート Hatena Bookmark ブックマーク

最近はDockerになってきてVagrantが下火になりつつある気もしますが、弊社では開発環境をVagrantベースにしています(しようとしている)
でVagrantfileをどう共有するかというのが結構悩み所でした。(まあそんなに悩んでないんだけどね)

実行する環境に依存するもの

開発環境の共有にVagrantは非常に便利なソリューションです。 開発者が同じ環境を使うことができるので、誰かの開発環境でしか動かないとか、新しい人が来たときにもすぐに環境を用意できるので非常に便利です。

しかし、実行する開発者の環境によって変更したい設定もいくつか存在します。

例えばipアドレス。 vagrantで仮想マシンで使うipアドレスを指定できます。
しかし、ipアドレスって指定したものを使うのは若干辛い所がある気がします。 違う仮想マシンか何かが同じipアドレス使っていたとか・・・

他にも仮想マシンが使うメモリ量や、mountする方法やmount先、mount元のディレクトリ。 これらはどうするのか?

上司のマシンはメモリふんだんにあるから仮想マシンに16GBもメモリを使うことができます。
しかしあなたのマシンにはメモリ4GBしかない・・・

Vagrantfileがgitで管理されているような状況で考えてみてください。 自分の環境に合わせてVagrantfileを変更するって良いことなのでしょうか?

実行環境に依存するものはgitで共有しない外部ファイルにしてしまえばいい

ではどうしたらいいのか?
答えはすごく簡単で、実行環境に依存する設定は、外部ファイルにしてしまえばいいのです。

  • Vagrantfile
  • vagrant_config.yml.dist

vagrantファイルと設定のベースとなるファイルだけ共有してしまいます。 で、あとはVagrantfileにconfig.ymlがあれば、config.ymlを、なければconfig.yml.distを読むようにしておけばいいのです。

Vagrantfile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# -*- mode: ruby -*-
# vi: set ft=ruby :
require 'yaml'

if File.exist?("vagrant_config.yml")
  config_yaml = YAML.load_file('vagrant_config.yml')
else
  config_yaml = YAML.load_file('vagrant_config.yml.dist')
end

Vagrant.configure(2) do |config|
  config.vm.box = "bento/centos-7.1"
  config.vm.network "private_network", ip: config_yaml['ip']
  config.vm.synced_folder config_yaml['synced_folder']['host'], config_yaml['synced_folder']['guest'], type: config_yaml['synced_folder']['type']

  config.vm.provider "virtualbox" do |vb|
    vb.memory = config_yaml['memory']
  end
end

vagrant_config.yml.dist

1
2
3
4
5
6
synced_folder:
  host: '../'
  guest: '/var/www/app'
  type: nfs

memory: 1024

これで、開発者の環境に依存するものをVagrantfileから排除することができます。

まとめ

人それぞれ、やり方があるのでなんとも言えませんが、最近僕はこんな感じでVagrantfileを用意しています。
もっと良い方法があれば教えて下さい。(Docker使えよってツッコミはなしで・・・)

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。