Vagrantで必要なものがインストール済みのboxを配布するにはAtlasを使うと楽ですが、外部に公開されることになるので、ものによっては適さない場合があります。
イントラネット内の共有フォルダなどにboxをおいて、それを使うといった方法もありますが、容量がそれなりに必要になりますし、管理もちょっと面倒です。
ということで、
- ベースとなるboxは公開されているもの
- ベースに対して構成管理ツール(Ansibleなど)を利用してセットアップ (構成管理+Vagrantfileをリビジョン管理)
がよさそうだなぁと思い、Vagrant の Ansible Provisioning を使おうと思いましたが、、
ホストOS(Windows)からAnsibleを実行するとなると、一気に面倒(そのためにcygwin入れるのは手間が…)になるので、Provisioning は shellにして、ゲストOS側でAnsibleを実行するようにしてみました。
単にshellでAnsibleを実行するようVagrantfileを書くだけです。
Vagrant.configure(2) do |config|
config.vm.box = "bento/centos-7.1"
config.vm.synced_folder ".", "/vagrant", create: true, mount_options: ['dmode=777','fmode=666']
config.vm.provision "shell", inline: <<-SHELL
yum install -y epel-release
yum install -y ansible
cd /vagrant
ansible-playbook -i hosts playbook.yml
SHELL
end
AnsibleのplaybookとVagrantfileもまとめてリポジトリで管理すれば、それをチェックアウトしてvagrant upするだけで環境が簡単にセットアップできます。
下記をcloneしてvagrant upすると、CentoOS 7.1上にPostgreSQL 9.5がインストールされた環境が立ち上がります。
なお、Vagrantの共有フォルダ(/vagrant)は、デフォルトのパーミッションが777となり、hostsに実行権限がついているためにエラーとなります。
==> default: ERROR: The file hosts is marked as executable, but failed to execute correctly. If this is not supposed to be an executable script, correct this with `chmod -x hosts`.
これを回避するには、Vagrantfileのconfig.vm.synced_folderの設定で、mount_optionsのfmodeとして実行権限を外してあげる必要があります。
config.vm.synced_folder ".", "/vagrant", create: true, mount_options: ['dmode=777','fmode=666']