Vagrant + Digitalocean + Ansible でのサーバ構築も結構慣れてきたので、Vagrantfile や Ansible playbook を Github にプッシュしておこうと思ったのですが、Vagrantfile に digitalocean のAPIキーなど、公開してはいけない情報があったので direnv を使って隠すようにしました。
direnvは、ディレクトリに環境変数をセットして、そのディレクトリがカレントになった時だけ環境変数が有効になるというもので、使い方によってはかなり便利に使えるものだと思います。
direnvのインストールですが、OS Xの場合はHomebrewでインストール出来ます
$ brew install direnv
インストール後、zshrcに下記記述をして source ~/.zshrc します(他シェルの場合はドキュメントを確認下さい)
eval "$(direnv hook zsh)"
そして、direnv edit . とコマンドを打ち、立ち上がったエディターで
export SECRET_KEY=secretkeyのように記述し、保存します。保存すると、カレントディレクトリに .envrc というファイルが出来ます。
作成した環境変数をシェルで確認してみます。
$ echo $SECRET_KEY
今度はPythonで確認してみます。
>>> import os >>> os.environ.get("SECRET_KEY")
肝心のVagrantfileへの記述する場合ですが、VagrantfileはRuby記法で書かれている為、Rubyで環境変数を取得するようにします。
ENV["SECRET_KEY"]と書けばいいみたいです。
追記: .envrc は .gitignoreへ記述して公開リポジトリへアップしないようにしましょう!
追記その2:zshrc への記述を
if [ -x "$(which direnv)" ]; then eval "$(direnv hook zsh)" fiのようにするとdirenv有無にかかわらずzshrcを使い回せます。
手持ちのマシン(MacBook Air (13-inch, Mid 2012))のSSD空き容量が少なくなってきたこともあり、ローカルにVMを立てるのをやめ、Vagrant+DigitalOcean+Ansibleを使ってFlask製アプリ(自家製ブログツール)を立ててこのエントリを書いています。
DigitalOceanでドロップレット(仮想マシン)を立てると毎度毎度新しいIPアドレス割り当てられるので、デプロイしたFlaskアプリにブラウザでアクセスするには、vagrant ssh-config というコマンドを叩いてIPを確認する必要があります。
$ vagrant ssh-config Host default HostName 128.199.xx.xx User hoge Port 22 UserKnownHostsFile /dev/null StrictHostKeyChecking no PasswordAuthentication no IdentityFile /Users/hoge/.ssh/digitalocean/id_rsa.digitalocean.com IdentitiesOnly yes LogLevel FATAL
毎回だと非常に面倒くさいのでopen コマンドとawkを使って
$ open http://$(vagrant ssh-config | awk '$1~/^HostName/{ print $2 }'):5000
このようにアクセスするようにしました。 open にurlを渡すとデフォルトブラウザ(自分の場合はChrome)で立ち上がってくれるので便利です。