Vagrant + chef-solo によるPHP + MySQLな開発環境構築入門

Pocket

開発環境をローカルPC上の仮想サーバに構築することが当たり前になってきた昨今、
環境構築をもっと効率良く、楽にしたいということで、遅ればせながらVagrant+chef-soloをいじり始めました。
なんとかそれっぽい開発環境が構築できたのでまとめておきます。

とにかく動く環境をまず作ってみる、Vagrant + chef-soloで開発できるイメージを持つ、ことを重視して作りました。

 

開発環境の概要

大体こんな感じの環境を作ります。 vagrant_chef_article 今回はFedora20上のVirtualBoxに仮想サーバを構築しています。 もちろんWindows上でもOSX上でも構築可能です。

※Windowsの場合、以降で説明するコマンドと少し違った手順が必要になる可能性があります。

「PHP」となっている部分も、Rubyなど他の言語にも置き換えが効くと思いますが、 今回はPHPで構築しています。 ソースコードを共有フォルダで参照するというやり方も、 他にもっといいやり方があるかもしれませんがとりあえずこれで。

Vagrant, chef-solo って?

Vagrant

乱暴に言うと、コマンドラインからVirtualBoxなどの仮想化ソフトウェアを操作できるツールです。 「仮想マシンのフロントエンド」というような説明がされることも多いようです。

VirtualBoxにあたる部分はプロバイダと呼ばれ、プロバイダにはVMwareやAmazonEC2も使えるようです。 Vagrantを使わなくても、VirtualBoxだけで仮想サーバを構築することはできます。 ただ、

  • 仮想サーバの構築・破棄を素早く行う
  • Chefなどのインフラ構築自動化ツールと連携する

ようなことが、Vagrantを使うことによって実現できます。 そのため、より柔軟で素早く、再現性の容易な開発環境を構築することができるようになります。

chef-solo

インフラ構築を自動化してくれるツール「Chef」のスタンドアロン版です。 (Chef ServerとChef Clientによる、クライアント/サーバー版もあります)

インフラの構築作業をコードで記述することができるため、 構築する環境ごとに手動で構築作業をする必要がなく、 記述した通りの環境を正確に何度でも再構築することができるようになります。

必要なツールのインストール

開発環境構築に必要なツールをインストールしていきます。

VirtualBox

https://www.virtualbox.org/wiki/Downloads からパッケージをダウンロードしてインストールします。

今回はFedora 20を使って構築するため、
http://download.virtualbox.org/virtualbox/4.3.12/VirtualBox-4.3-4.3.12_93733_fedora18-1.x86_64.rpm
をダウンロードしてインストールします。

Vagrant

http://www.vagrantup.com/downloads.html からパッケージをダウンロードしてインストールします。

今回はFedora 20を使って構築するため、
https://dl.bintray.com/mitchellh/vagrant/vagrant_1.6.3_x86_64.rpm
をダウンロードしてインストールします。

Vagrantがインストールされていることを確認します。

vagrant-omnibus

vagrant up(privision)の際に、仮想サーバにchefを自動インストールしてくれるvagrantのプラグインです。

プラグインのリストを確認します。

Ruby、RubyGems

後述するknife-soloのインストールにRubyGemsが必要なため、 RubyとRubyGemsをインストールします。インストールの詳細は割愛します。 私はRVMでインストールしています。

knife-solo

gemを使って、knife-solo をインストールします。

knifeとは、作成したクックブックをサーバに適用するためのコマンドを提供するツールです。
knife-soloはknifeのプラグインで、リモートサーバに対してローカルのクックブックやレシピを適用することができます。 knife-soloのインストールに伴って、依存関係のあるknifeも同時にインストールされます。

また、knifeの初期設定も行っておきます。
いくつか設定項目を聞かれますが、すべてデフォルトのままで作成します。

全体のディレクトリ構造

以下のディレクトリ構造となるように作業を進めていきます。

必要なディレクトリを作成して、移動しておきます。

Vagrantの設定

boxの追加、Vagrantfileの作成

vagrant initコマンドを実行します。VagrantfileというVagrantの設定ファイルが作成されます。
OSのboxイメージは、http://www.vagrantbox.es/ こちらに公開されているものから、CentOS6.5を使います。

作成されたVagrantfileの中を確認すると、以下の項目が自動作成されています。

config.vm.box_url

‘vagrant up’コマンドで仮想サーバーを起動した際に、 boxがローカルにあればそれを適用して起動、ローカルに無ければbox_urlのアドレスからboxを取ってきて起動、という動作をしてくれます。

他にも、開発環境として利用するためにいくつか項目を追加する必要がありますが、とりあえずデフォルトのままにしておきます。Chefのクックブックやレシピを作成した後で編集します。

(参考) vagrant box add を使った作成

‘vagrant box add’, ‘vagrant init’ コマンドを使うことでも、boxの追加とVagrantfileの作成ができます。 ただしこの場合、Vagrantfile内の”config.vm.box_url”項目が自動作成されないようです。

他のメンバーにVagrantfileを渡した際に、’vagrant up’一発で仮想サーバー起動ができるようにしたかったため、今回は’vagrant init’コマンドで、box_urlを自動作成してもらうようにしました。
(手動でbox_url追加しても同じ話、なわけですが)

Vagrant起動

ここで一旦Vagrantで仮想サーバを起動します。 初回起動はboxのダウンロードも必要なため少し時間がかかります。

とあるように、phpmsというbox名が見つからないため、追加(インストール)してくれています。 box一覧を確認します。

ホーム配下の.vagrant.dディレクトリにも仮想マシン用ファイルが作成されています。

起動した仮想サーバにsshでアクセスすることもできます。

Chefリポジトリの作成

vagrantを使って仮想サーバの起動ができたので、 起動されたサーバに適用するインフラ構成をChefで定義していきます。

まずはknifeを使って、Chefの実行に必要なChefリポジトリを作ります。 リポジトリの名前(ディレクトリ名)は”chef”とします。

chefリポジトリの中には、 Chefの実行に必要なファイルとディレクトリが格納されています。

リポジトリのディレクトリ構成

knifeで作成されたリポジトリのディレクトリ構成です。

多くのディレクトリやファイルがありますが、今回は、

  • site-cookbooks

しか使いません。

クックブックの作成

PHP + MySQL環境に必要な以下パッケージのクックブックを作成します。

  • apache
  • php
  • mysql
  • remi
  • localedef

自作のクックブックはsite-cookbooksに置くそうなので、site-cookbookに作成します。
※自作ではないクックブックというのは、コミュニティクックブックと言って、 WEB上に公開されているクックブックのことです。

レシピ、テンプレートの作成

インフラ構成を定義するためのレシピと、レシピが利用するテンプレートを書いていきます。
レシピは、各クックブックのrecipes配下に、テンプレートファイルは、各クックブックのtemplates/default配下に作成します。

作成するファイルを以下に示します。
各クックブックのrecipes/default.rb は”knife cookbook create”実行時に自動的に作成されています。

localedef/recipes/default.rb

ファイル中の日本語を正常に読み込むためにロケール設定用のクックブックを作成します。
※これ分かるまで、日本語の文字化け状態が解消できずに結構ハマりました。。

remi/recipes/default.rb

各パッケージの新しいバージョンをインストールするために、外部yumリポジトリremiのクックブックを作成します。

apache/recipes/default.rb

Apacheインストールのレシピです。

serviceブロックの説明

supportでは、サービスが使えるアクションを定義するらしく、とりあえず指定しておきます。
actionでは、:enableで自動起動設定、:startでサービスの起動を指示します。

templateブロックの説明

「ローカルの”http-2.2.conf.erb”を 仮想サーバの”/etc/httpd/conf/httpd.conf”として配置する」
という意味になります。

apache/recipes/phpms.rb

後述のphpms.vm.confを配置するためのレシピです。

apache/templates/default/httpd-2.2.conf.erb

httpd.confのテンプレートです。
NameVirtualHostを有効にするために、http2.2のインストール時に作成されるhttpd.confファイルをコピーしてきて、 以下の内容を追記しただけ。

apache/templates/default/phpms.vm.conf.erb

ホスト名”phpms.vm”でアクセスした際の設定ファイルのテンプレートです。

php/recipes/default.rb

PHPをインストールします。 PHP5.5をインストールするために、”remi-php55″を有効にしています。

mysql/recipes/default.rb

新しいMySQLをインストールしたいので、mysql-commnityリポジトリを追加してからインストールします。

mysql/recipes/createdb_phpms.rb

データベース、ユーザーを作成し、テーブルを作成するスキーマ定義スクリプトも実行します。

mysql/templates/default/createdb.sql.erb

mysql/templates/default/createuser.sql.erb

mysql/templates/default/createuser.sql.erb

PHPコードの記述

srcディレクトリ配下に、PHPの動作確認用のコードを追加しておきます。

src/phpms/public/select_test.php

Vagrantfileの編集

以下のようにVagrantfileを設定します。

主な設定項目

config.vm.network

private_network(ホストオンリーネットワーク)として、任意のIPアドレスを設定します。

ホストオンリーネットワークとは、ホストOSとゲストOS間でのみ通信できるネットワークです。
ホストOSから仮想サーバにアクセスする際には、ここで設定したIPアドレスを使用します。

config.vm.synced_folder

共有フォルダを設定します。

ここで設定したホストOSのフォルダは、ゲストOSからマウントされます。 この仕組みを利用して、ホストOSに存在するPHPソースコードを、ゲストOSから参照できるようにします。

config.vm.provision “chef_solo”

vagrantのプロビジョニングにchef soloを使うための設定です。

後述するvagrant upを実行すると、仮想マシンの起動とプロビジョニングが実行されます。
そのプロビジョニングの際にchef_soloを使うよう設定しています。
run_listには、実行するレシピを記述します。

config.omnibus.chef_version

先述の vagrant-omnibus を使って、 仮想サーバにchefがインストールされていない場合、自動的に最新バージョンをインストールしてもらうための設定です。

:latest という値からも、最新バージョンであることが読み取れるかと思います。

仮想サーバのプロビジョニング

以上のインフラ設定を、仮想サーバに適用します。

PHP動作確認

PHPの動作確認をします。動作確認前に、hostsに想定するホスト名を設定します。

hostsの設定

phpms.vm というホスト名を想定しているため、hostsファイルに記述します。 Vagrantfileのprivate_networkに設定したIPアドレスを記述します。

動作確認

下記のURLにアクセスすると、PHPが動作していることが確認できます。

  • http://phpms.vm/select_test.php

まとめ

以上のように、仮想サーバの環境構築を自動化することで、

  • 会社で作った環境を自宅で再現する
  • チームメンバーに開発環境を配布する

などのことが簡単にできるようになります。

今回作成したファイルは、githubにもpushしておきました。参考になれば幸いです。
https://github.com/shusatoo/phpms
ダウンロードしたファイルを適当なディレクトリに配置して、”vagrant up”を実行すれば仮想サーバーが起動します。 (VirtualBox, Vagrant, knifeがインストール済みであること)

Chefの正しい知識を身につけるならこの本で。
(購入しましたが、本記事はこの本読む前に書いてしまいました)

参考URL

以下のページを参考にさせていただきました。ありがとうございます。

今っぽい Vagrant + Chef Solo チュートリアル
ChefでMySQL5.6をインストール
構成管理ツール「Chef」の一歩進んだ使い方 ―独自のResourceを定義する―
Chef Soloの正しい始め方
仮想環境構築ツール「Vagrant」で開発環境を仮想マシン上に自動作成する
サーバー設定ツール「Chef」応用編:knife-soloとData Bagを使う
nanapi勉強会でVagrant + Berkshelfについて発表しました

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Post Navigation