ククログ

株式会社クリアコード > ククログ > 手動でインベントリーファイルを作らずにVagrantとAnsibleを一緒に使う方法

手動でインベントリーファイルを作らずにVagrantとAnsibleを一緒に使う方法

最近、Hatoholというオープンソースの運用管理ツールの開発にも参加しています。

開発環境はDebian GNU/Linux sidなのですが、Hatoholのサポート環境にはCentOS 6も含まれているため、ドキュメントを書くときなどはCentOS 6で動作を確認する必要があります。ただ、「Hatohol用のCentOS 6環境」を常時用意しておくのは管理が面倒1です。そのため、仮想マシン上に何度でも簡単にセットアップできるようにしました。

「何度でも簡単にセットアップできる」の部分にはAnsibleを使いました。これは、HatoholのリポジトリーにすでにAnsibleのplaybookファイルが存在したためです。playbookファイルはあるので、Vagrantと組み合わせて仮想マシン上にセットアップできるようにしました。

VagrantとAnsibleの連携方法を調べると、日本語の情報のものはだいたい手動でインベントリーファイルを作っています。Vagrantのサイトにあるドキュメント(英語)ではインベントリーファイルはVagrantが自動で作ってやるよと書いているのに、です。

インベントリーファイルを自動で作ってもらう方が手間が少なく、IPアドレスやホスト名などを明示しなくてもよいので管理が簡単になります。そのため、Vagrantに自動で作ってもらうときの使い方を日本語で紹介します。

インベントリーファイルを自動で作る方法

インベントリーファイルを自動で作るには、特別なことを何もしなければよいです。つまり、Vagrantはデフォルトでインベントリーファイルを自動で作るようになっています。

特別なことというのは、例えば、ansible.cfgを作ったり、ansible.inventory_pathを指定したり、といったことです。

インベントリーファイルを自動で作ると困ること

インベントリーファイルを自動で作ることは何もしなければよいだけなので簡単なのですが、playbookの書き方によってはうまく動きません。具体的には次のケースはひと手間かけないとうまく動きません。

  • hostsall以外を指定している
  • userを指定していて、さらに指定した値がvagrantではない(user自体を設定していない場合はひと手間は必要ない)
  • root権限で実行することを想定している(sudoを指定していない)

それぞれどのようにひと手間かければよいか説明します。なお、どれもHatoholの既存のplaybookファイルが該当しているケースです。

hostsall以外を指定している

hostsall以外を指定していると、Vagrantで作った仮想マシンは指定したグループに所属していなければいけません。ホストがどのグループに所属するかはインベントリーファイルで指定します。今はインベントリーファイルはVagrantが自動で作る前提なので、Vagrantにグループとホストの対応を伝えてうまく作ってもらう必要があります。

具体的には次のようにansible.groupsを使います。この例はplaybookファイルでhosts: targetsと指定されていたケース用です。

id = "centos-6-x86_64"
box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box"
config.vm.define(id) do |node|
  node.vm.box = id
  node.vm.box_url = box_url
  node.vm.provision("ansible") do |ansible|
    ansible.playbook = "setup-hatohol-dev.yaml"
    ansible.groups = {
      "targets" => [id],
    }
  end
end

これでインベントリーファイルに次のような内容が入ります。

[targets]
centos-6-x86_64

playbookファイルが対象としているグループにVagrantで作ったホストが入っているので、playbookファイルで指定したタスクが実行されます。

userを指定していて、さらに指定した値がvagrantではない

Vagrantが作った仮想マシンにはvagrantユーザーでログインします。playbookファイルでuserを指定しているとその設定が優先され、仮想マシンにログインできません。この場合はansible.extra_vars:ansible_ssh_userを指定することでSSHするユーザーを変更できます。

具体的には次のようにansible.extra_varsを使います。

id = "centos-6-x86_64"
box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box"
config.vm.define(id) do |node|
  node.vm.box = id
  node.vm.box_url = box_url
  node.vm.provision("ansible") do |ansible|
    ansible.playbook = "setup-hatohol-dev.yaml"
    ansible.extra_vars = {
      :ansible_ssh_user => "vagrant",
    }
  end
end

これでplaybookファイルで指定されているユーザーではなく、vagrantユーザーでSSHしてくれるようになります。

root権限で実行することを想定している

vagrantユーザーは一般ユーザーです。root権限が必要な場合はsudoを使わなければいけません。playbookファイルにsudo: trueという設定がない場合はsudoを使ってくれないのでVagrant側からsudoを使ってほしいということを伝える必要があります。

具体的には次のようにansible.sudo=を使います。

id = "centos-6-x86_64"
box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box"
config.vm.define(id) do |node|
  node.vm.box = id
  node.vm.box_url = box_url
  node.vm.provision("ansible") do |ansible|
    ansible.playbook = "setup-hatohol-dev.yaml"
    ansible.sudo = true
  end
end

これで、たとえplaybookファイル中でsudo: trueを指定していなくてもsudoを使って実行してくれるようになります。

まとめ

VagrantとAnsibleを一緒に使う方法を検索すると、日本語の情報ではインベントリーファイルを手動で作成する情報が多かったので、より手間の少ないVagrantに自動で作成してもらう方法を日本語で紹介しました。自動で作成する方法はVagrantのサイトにあるドキュメント(英語)には書いているので、本家の情報も参考にしてください。よく知らないツールの使い方を調べるときは、念のため、本家の情報も参考にした方がよいでしょう。

VagrantとAnsibleの連携方法は具体的なVagrantファイルの書き方を示しました。実際に使っているVagrantファイルも参考にしてください。

また、Hatoholというオープンソースの運用管理ツールの開発にも参加していることを匂わしました。

  1. 別のマシンで開発しようとした時、「Hatohol用のCentOS 6環境」にアクセスできないかもしれない。