仮想環境構築ツール「Vagrant」で開発環境を仮想マシン上に自動作成する
仮想マシンのプロビジョニング
最後に、Vagrantで作成した仮想マシンの初期環境設定(プロビジョニング)についても紹介しておこう。Vagrantには、「vagrant up」コマンドの実行時、仮想マシンの環境設定完了後にあらかじめ指定しておいたコマンドを実行する機能がある。たとえば、特定のコマンドを実行するにはVagrantfile内に以下のような項目を追加すれば良い。
config.vm.provision "shell", inline: "<実行するコマンド>"
ここで記述されたコマンドは、仮想マシンの作成された直後のみに実行される。すでに作成されている仮想マシンに対し「vagrant up」コマンドを実行した場合は実行されない。また、「vagrant provision」コマンドを実行することでも指定されたコマンドが実行される。
また、任意のシェルスクリプトを実行することも可能だ。この場合、以下のように「inline」の代わりに「path」オプションを使用し、そこで実行するスクリプトファイルのパスを指定する。
config.vm.provision "shell", path: "<実行するスクリプトのパス名>"
ここで、実行するスクリプトのパス名はVagrantファイルからの相対パスで指定可能だ。たとえば、Vagrantファイルと同じディレクトリにある「setup.sh」というシェルスクリプトを実行させたい場合、次のように指定できる。
config.vm.provision "shell", path: "./setup.sh"
また、パスにはURLの指定も可能だ。その場合、指定されたURLからファイルをダウンロードしたうえでそれが実行される。
config.vm.provision "shell", path: "http://example.com/setup.sh"
ChefやPuppetを利用したプロビジョニング
VagrantではChef(Chef SoloおよびChef Client)やPuppetといった構成管理ツールを利用したプロビジョニング機能も用意されている。仮想マシンの作成後、ChefやPuppetで必要な設定ファイルを仮想マシン内に転送したうえでchefやpuppetコマンドを実行して環境設定を行う、という作業を自動化するというものだ。これらについても、基本的にはVagrantfile中に設定項目を記述することで利用できる。
ChefやPuppetの基本的な使い方については過去記事でも紹介しているのでそちらを参照してほしい(「サーバー設定ツール「Chef」の概要と基礎的な使い方」および「Puppetを使ったLinuxシステムの設定自動管理」)。
なお、ChefやPuppetを利用する場合、あらかじめChefやPuppetがインストールされたboxファイルを使用する必要がある。たとえば、Puppetの開発元(Puppet Labs)はあらかじめPuppetがインストールされたboxファイル(Puppet Labs Vagrant Boxes)を配布している。
また、Chefについては「vagrant-omnibus」という、仮想マシンに自動的にChef環境をインストールするVagrant向けプラグインが提供されている。vagrant-omnibusを利用するには、以下のように「vagrant plugin」コマンドを実行するだけで良い。
$ vagrant plugin install vagrant-omnibus
次に、Chefを利用したい仮想マシンのVagrantfile内で次のような設定項目を記述する。
config.omnibus.chef_version = "<インストールするChefのバージョン番号>"
たとえばChef 11.8.0を利用する場合、以下のように記述する。
config.omnibus.chef_version = "11.8.0"
ここでバージョン番号の代わりに「:latest」を指定することで、実行時点での最新版をインストールできる。
config.omnibus.chef_version = :latest
Chef Soloを利用したプロビジョニング
プロビジョニングにChef Soloを利用する場合、Vagrantfile内に以下のような設定項目を記述する。
config.vm.provision "chef_solo" do |chef| : ここに設定内容を記述する : end
記述できるChef Solo向けの主な設定項目としては表1のものがある。
項目名 | 説明 | デフォルトの値 |
---|---|---|
chef.add_recipe | 実行するレシピ名 | - |
chef.cookbooks_path | クックブックが格納されているディレクトリ | cookbooks |
chef.data_bags_path | Data Bagが格納されているディレクトリ | data_bags |
chef.encrypted_data_bag_secret_key_path | 暗号化Data Bagを利用する場合に使用する秘密鍵のパス名 | - |
ディレクトリやパス名はVagrantfileからの相対パスで指定可能だ。たとえば「recipe_foo」というクックブックを実行したい場合、まずVagrantfileが格納されているディレクトリ内に「cookbooks」というディレクトリを作成し、そこに使用するクックブックを格納したうえで、Vagrantfile中に以下のような設定項目を記述すれば良い。
config.vm.provision "chef_solo" do |chef| chef.add_recipe "recipe_foo" end
Chef Serverを利用したプロビジョニング
Chef Serverが利用できる環境でChef Clientを利用してプロビジョニングを行う場合は、Vagrantfile内に以下のような設定項目を記述する。
config.vm.provision "chef_client" do |chef| chef.chef_server_url = "<Chef ServerのURL>" chef.validation_key_path = "認証に使用する証明書(validation.pem)ファイル" : ここにChef Client用の設定内容を記述する : end
Chef Serverを利用してプロビジョニングを行う場合、Chef ServerのURLと認証用の証明書ファイル(validation.pemファイル)を指定しておく必要がある。validation.pemファイルはVagrantfileと同じディレクトリに配置しておくのが一般的だ。
それ以外の設定項目はChef Soloの場合とほぼ同じだ。たとえば「recipe_foo」というレシピを実行する場合、設定項目は以下のようになる。
config.vm.provision "chef_client" do |chef| chef.chef_server_url = "<Chef ServerのURL>" chef.validation_key_path = "validation.pem" chef.add_recipe "recipe_foo" end
Puppetを利用したプロビジョニング
Puppetを利用する場合、Vagrantfile内に以下の設定項目を記述する。
config.vm.provision "puppet"
また、実行するマニフェストファイルはVagrantファイルが格納されているディレクトリ内に「manifests」というディレクトリを作成してそこに配置すれば良い。デフォルトではmanifestsディレクトリ内の「default.pp」というファイルが使用される。
Puppet Serverを利用したプロビジョニングも可能だ。この場合はVagrantfile内に以下の設定項目を記述すれば良い。
config.vm.provision "puppet_server" do |puppet| puppet.puppet_server = "<Puppetサーバーのホスト名>" end
「容易に再構築可能な開発環境」で作業の効率化を
Vagrantの利点の1つは、設定ファイルであるVagrantfileおよび関連するプロビジョニング用のスクリプトファイルさえあれば、簡単に同一の環境を再構築できるという点だ。VagrantはLinuxだけでなくWindowsやMac OS Xでも利用でき、異なるプラットフォームでもまったく同一の開発環境を実現できる。
また、Vagrantはあくまで開発・テスト環境構築向けのツールであるが、運用環境をChefやPuppetなどの設定管理ツールを使って構築しているのであれば、比較的容易に運用環境にテスト環境を構築できるのもメリットだ。
なお、今回は仮想化ソフトウェアとしてVirtualBoxを使用したが、VagrantではデフォルトでVMwareによる仮想化もサポートされているほか、KVMを利用するための「vagrant-kvm」というプラグインもサードパーティによって開発されている。Linux環境でしか使えないものの、VirtualBoxよりもKVMのほうが利用しやすい場合も多いため、Linux環境でのみ使用するのであればこちらの利用も検討すると良いだろう。
【関連記事】
>>Vagrantで作った仮想マシンを簡単に共有できる「Vagrant Share」を使ってみる