Vagrantによる仮想環境の構築
それではこれまで作成したCookBookをもとにして、Vagrantを使ってローカルのPCに仮想環境を作成します。
Vagrantfileの作成
Vagrantで作成した仮想環境上でChefによるプロビジョニングを行うためには、あらかじめ仮想環境内にChefがインストールされている必要があります。そのため、omnibusというvagrantのプラグインを使用します。このomnibusはvagrantの起動時にChefがインストール済みかを確認し、インストールしていなければ自動でインストールしてくれるものです。今回は、Chefのバージョン12.0.3を使用しましたので、omnibusのversionも同じものを指定します。
# chefをVMにインストールするプラグイン config.omnibus.chef_version = "12.0.3"
これで準備が整いましたので、VagrantfileからChefを呼び出してプロビジョニングするコードを記述します。
# Chefの設定 config.vm.provision "chef_solo" do |chef| # cookbooksの場所を指定します chef.cookbooks_path = "../httpserver" # apacheという名前のCookBookを適用 chef.run_list = %w[ recipe[apache] ] end
Vagrantで使うプロビジョニングツールをchef-soloとし、chef.cookbooks_pathでプロビジョンに必要なCookBookのファイルパスを指定します。
次に、chef.run_listで実行するCookBookの名前を指定します。今回は、httpserverというフォルダの中にあるapacheというCookBookを使って環境が構築されます。
なお、VagrantおよびVagrantfileの詳細については、サンプルファイルおよび前回の記事を参考にしてください。
Vagrantの起動
VagrantfileおよびChefのCookBookが用意出来ればVagrantの仮想環境を起動します。今回のサンプルでは以下のようなディレクトリ構成になっていますので確認してください。
├─httpserver │ └─apache │ ├─attributes │ │ default.rb・・・属性値を定義 │ ├─definitions │ ├─files │ │ └─default │ │ index.php・・・Webサーバに配置するファイル │ ├─libraries │ ├─providers │ ├─recipes │ │ default.rb・・・実行するレシピ │ ├─resources │ └─templates │ └─default │ httpd.conf.erb・・・httpd.confのテンプレート └─vagrant Vagrantfile・・・仮想環境を起動するためのファイル
この状態で、次のコマンドを実行してVagrantを起動します。
E:\chef-sample\vagrant> vagrant up
コンソールのログを確認すると、Vagrantで起動した仮想環境からChefのレシピが呼び出されて環境が自動で構築されているのが分かります。
INFO: *** Chef 12.0.3 *** INFO: Chef-client pid: 2632 INFO: Setting the run_list to ["recipe[apache]"] from CLI options INFO: Run List is [recipe[apache]] INFO: Run List expands to [apache] INFO: Starting Chef Run for vagrant-centos65.vagrantup.com INFO: Running start handlers INFO: Start handlers complete. INFO: --- [START] WebServer Install from Chef --- INFO: remote_file[/tmp/remi-release-6.rpm] created file /tmp/remi-release-6.rpm INFO: remote_file[/tmp/remi-release-6.rpm] updated file contents /tmp/remi-release-6.rpm INFO: yum_package[httpd] installing httpd-2.2.15-39.el6.centos from base repository INFO: yum_package[php] installing php-5.5.21-1.el6.remi from remi-php55 repository INFO: yum_package[php-mbstring] installing php-mbstring-5.5.21-1.el6.remi from remi-php55 repository INFO: template[httpd.conf] backed up to /var/chef/backup/etc/httpd/conf/httpd.conf.chef-20141209140550.625861 INFO: template[httpd.conf] updated file contents /etc/httpd/conf/httpd.conf INFO: cookbook_file[/var/www/html/index.php] created file /var/www/html/index.php INFO: cookbook_file[/var/www/html/index.php] updated file contents /var/www/html/index.php INFO: cookbook_file[/var/www/html/index.php] owner changed to 0 INFO: cookbook_file[/var/www/html/index.php] group changed to 0 INFO: cookbook_file[/var/www/html/index.php] mode changed to 644 INFO: service[httpd] enabled INFO: service[httpd] started INFO: --- [END] WebServer Install from Chef --- INFO: Chef Run complete in 166.613541373 seconds
エラーが発生すると、原因がコンソールに表示されますので、今一度レシピやCookbookで用意したファイルなどを見直してください。
動作確認を行うときは、ローカルのPCから以下のURL
http://192.168.33.10/
にアクセスします。仮想環境上でWebサーバが起動しPHPのプログラムが動いていることが確認できます。
おわりに
前回および今回の記事では、Chefをつかった開発環境の構築手順について紹介しました。駆け足でごく基本的なChefでのコーディングを説明しましたが、Chefの機能は非常に豊富で、ご紹介した以外にもさまざまなことができます。また、今回のサンプルではCookBookに1つのレシピを作成しましたが、実運用を行う上では環境に応じて複数のレシピを作成したり、複数のノードに展開できるよう再利用性を考えながらコードを書いていったりすることが必要になります。まさに、業務アプリケーションの開発と同じですね。
しかしなんといっても、作成したCookBookやVagrantfileをGitなどのバージョン管理ツールを使って、開発チーム内で共有しておけば、同じテスト環境をなんどでも簡単に構築することが可能になります。これが、コードによるインフラ構築(Infrastructure as Code)の醍醐味です。「こっちではうごくけど、あっちではうごかない」をなるべく開発の早い段階でなくすことで、プロジェクト全体の開発生産性を上げることができます。
次回の記事では、コンテナ型仮想化技術であるDockerを使って開発環境と同じ構成を、本番環境で動かすことができるインフラ構築の手順を紹介します。