VagrantでゲストOSをセットアップするには、次の3通りがあります。
- Vagrantfileの中ではプロビジョニングを使わず、ゲストOSを立ち上げるだけにして、ansible単独でゲストOSを操作する方法
- Vagrantfileの中でconfig.vm.provision 'ansible_local'として、Vagrantのansible_localというプロビジョニングを使う方法
- Vagrantfileの中でconfig.vm.provision 'ansible'として、Vagrantのプロビジョニングを使う方法
今回は、3番目のVagrantのansibleプロビジョニングを使ってゲストOSをセットアップします。
AnsibleもVagrantも、ansibleプロビジョニングをWindowsホストではサポートしていないのでその点はご了承ください。
前回までに、MSYS2上でAnsibleが動くことがわかりました。
まず、これまでのように、ホストからansible-playbookでゲストOSが操作できることを確認します。
これで素直にVagrantのプロビジョニングのなかでansibleが使えるかというと、エラーが出て使えません。
そこで、Cygwinでの動作例を参考に次のようにしました。
ansble-play.batという次のようなファイルを作ってPATHの通ったところに置きます。
@echo off REM MSYS2のインストール場所 set MSYS=C:\msys32 REM bash.exeからansible-playbookを起動します set SH=%MSYS%\usr\bin\bash.exe "%SH%" -c "/usr/bin/ansible-playbook %*"
これで、Vagrantからansible-playbookを呼び出すことができます。
Vagrantfileは次の通りです。ゲストOSはubuntu/xenial64にしたのですが、このイメージはpythonが含まれていません。そのため、shellプロビジョニングを使ってインストールしました。このとき、aptのソースファイルを書き換えて少し速くインストールするようにしました。
ansibleプロビジョニングでは、Playbookをsite.yml、コンフィグレーションファイルにansible.cfg、インベントリファイルにhostsを指定しました。
Vagrantfile
VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = "ubuntu/xenial64" config.vm.network "private_network", ip: "192.168.33.10" config.vm.provision "shell", inline: <<-SHELL # aptのソースファイルを書き換え sed -i s%archive.ubuntu.com/ubuntu%ftp.jaist.ac.jp/pub/Linux/ubuntu/%g /etc/apt/sources.list apt-get update apt-get -y install python aptitude SHELL config.vm.provision "ansible" do |ansible| ansible.playbook = "site.yml" ansible.config_file = "ansible.cfg" ansible.inventory_path = "hosts" ansible.limit = 'all' end end
次にansible.cfgファイルです。vagrant ssh-configで表示される結果をもとに作ります。Userをremote_userに、IdentityFileをprivate_key_fileにします。
control_pathの設定は、CygwinやMSYS2を使ったときにエラーになるのを回避するためです。こちらの情報をもとにしました。
ansible.cfg
[defaults] inventory = hosts remote_user = ubuntu host_key_checking = False private_key_file = .vagrant/machines/default/virtualbox/private_key [ssh_connection] # for Cygwin, MSYS2 control_path = /tmp
インベントリファイルは、次の通りです。vagrantsというグループで、ubuntu01という名前にしました。IPアドレスはVagrantfileと合わせます。これが違っていてよくSSHのエラーになりました。
hosts
[vagrants] ubuntu01 ansible_host=192.168.33.10
最後はPlaybookです。Apache2をインストールすることにしました。
vagrantsというグループにubuntuでアクセスします。aptでapache2の最新版ををインストールしてbecome: trueでスーパーユーザーで行います。
site.yml
--- - hosts: vagrants user: ubuntu tasks: - name: install packages Apache2 apt: name=apache2 update_cache=yes become: true
4つのファイルがそろえば、vagrant upでサーバーが設定され、http://192.168.33.10/にアクセスするとApache2の画面を見ることができます。
使ってみて、VagrantのAnsibleプロビジョニングはVagrantと一緒に使うときは便利ですが、Ansible単独で設定したほうが自由度はあるのかなという感じがしました。