Vagrant+Ansibleで環境を配布する(Windows)

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`.

これを回避するには、Vagrantfileconfig.vm.synced_folderの設定で、mount_optionsfmodeとして実行権限を外してあげる必要があります。

  config.vm.synced_folder ".", "/vagrant", create: true, mount_options: ['dmode=777','fmode=666']