Glide Note

glidenote's blog

dotenvを利用して環境ごとでVagrantfileの設定値を変更してみる

tcnksmさんのブログを見てて

おー、便利そうと眺めていたらdotenvで実現出来るとのやりとりを目撃。

私もdotenvを知らなかったので、Vagrant+dotenvがどんな感じで使えるのかやってみた。

Vagrantからdotenvが使えるようにインストール

何故かvagrant plugin installにはvagrant-*みたいなのしかインストール出来ないと勝手に勘違いしてたんですが、 普通にgem installしているだけなので、下記でdotenvが導入出来る。 (saharaが普通にそうだったし、~/.vagrant.d/gems/gems/の中を見れば普通にプラグインに依存してるgemが入ってるのも分かる)

1
vagrant plugin install dotenv

.envを用意

dotenvはディレクトリ内にある.envというファイル中身を参照するので、 環境ごとで変更する値を.envに下記のように記載。

1
2
3
4
VM_HOSTNAME     = 'dev001.foovar.com'
DO_CLIENT_ID    = 'my_client_id'
DO_API_KEY      = 'my_api_key'
DO_SSH_KEY_NAME = 'my_ssh_key_name'

Vagrantfileから.envの内容を呼び出す

.envの内容を呼び出すにはDotenv.loadVagrantfileに記載して、${ENV['HOGE']}みたいな感じで呼び出す。 私が普段使ってるDigitalOcean用のVagrantfileで使ってみると下記のような感じ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Dotenv.load

Vagrant.configure('2') do |config|
  config.vm.hostname              = "#{ENV['VM_HOSTNAME']}"
  config.vm.provision "shell", inline: "test -e /etc/yum.repos.d/epel.repo || rpm -Uvh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm"
  config.vm.provision "shell", inline: "test -e /etc/puppet || yum -y install puppet"

  config.vm.provider :digital_ocean do |provider, override|
    provider.client_id            = "#{ENV['DO_CLIENT_ID']}"
    provider.api_key              = "#{ENV['DO_API_KEY']}"
    provider.ssh_key_name         = "#{ENV['DO_SSH_KEY_NAME']}"

    override.ssh.private_key_path = '~/.ssh/id_rsa'
    override.vm.box               = 'digital_ocean'
    override.vm.box_url           = "https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box"

    provider.image                = 'CentOS 6.4 x64'
    provider.region               = 'Singapore 1'
    provider.size                 = '512MB'
    provider.ca_path              = '/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt'
  end
end

vagrant upしてみる。

1
vagrant up --provider=digital_ocean

ちゃんと動いた。

Vagrantfileを共通化して、環境毎で個別に設定を変更したい場合や特定の値は公開したくない場合などはdotenv使えば良さそう。

(Vagrant+dotenvについては以前Vagrantのissueに提案されてましたPackerのuser variablesを使えと一蹴されてた。)

GitHubとかに公開する場合は誤って.envを公開しないよう.gitignoreに追加をお忘れ無く。

参考

Comments