***本記事にはプロモーションが含まれています。***
VagrantでゲストOSをセットアップするには、次の3通りがあります。
- Vagrantfileの中ではプロビジョニングを使わず、ゲストOSを立ち上げるだけにして、ansible単独でゲストOSを操作する方法
- Vagrantfileの中でconfig.vm.provision 'ansible_local'として、Vagrantのansible_localというプロビジョニングを使う方法
- Vagrantfileの中でconfig.vm.provision 'ansible'として、Vagrantのプロビジョニングを使う方法
このうち、今回はansible_localを使う方法を試してみます。
Vagrantのプロビジョニングでansible_localを使う場合には、ホストOSにはansibleをインストールしてある必要はありません。
ゲストOSにansibleが自動的にインストールされ、そこでansible-playbookが実行されます。
ポイントは2つあります。1つは、Vagrantfileでprovisionにansible_localを設定します。2つめは、Playbookでconnection: localを使うことです。
ansible_localを指定すると、ゲストOSにansibleが自動的にインストールされます。
実際の例は以下の通りです。
Vagrantfileは次の通りです。プライベートアドレスに192.168.33.10を指定して、provisionにansible_localを指定します。Playbookにsite.ymlを指定し、インベントリファイルに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 "ansible_local" do |ansible| ansible.playbook = "site.yml" ansible.inventory_path = "hosts" ansible.limit = 'all' end end
インベントリファイルは次の通りです。vagrantsというグループにubuntu01というホスト名のサーバーがあり、アドレスは192.168.33.10としています。
hosts
[vagrants] ubuntu01 ansible_host=192.168.33.10
Playbookは次の通りです。vagrantsというグループに、connection: localという設定で、ubuntuというユーザーにログインします。そこで、Apache2をインストールしています。
site.yml
--- - hosts: vagrants connection: local user: ubuntu tasks: - name: install packages Apache2 apt: name=apache2 update_cache=yes become: yes
connection: localがないと、次のようなエラーになります。
TASK [Gathering Facts] ********************************************************* fatal: [ubuntu01]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Host key verification failed.\r\n", "unreachable": true} to retry, use: --limit @/vagrant/site.retry
connection: localを使わないと、ゲストOSにansibleをインストールしてあるのに、わざわざ自分自身にsshでログインしてplaybookを実行しようとします。そのとき、SSHのエラーになります。
ansible_localを使うと、ansibleは自動的にインストールしてくれますので簡単ですね。