初心者〜中級者はじめに開発環境の構築は、アプリを作る上で重要ですが、楽をしたい作業です。開発環境構築で手を抜き、チームメンバー間で環境の差異がでてしまった場合、問題があった時の切り分けが困難になってしまいます。使った開発環境の構築についてご紹介したいと思います。プログラマブルに作成/破棄できるツールです。拡張することができます。Environments)。いうツールに同梱されている、プロビジョニングツールです。プロビジョニングツールとは、サーバー構築・管理を自動化するツールです。chefはサーバークライント構成をとって、サーバーの構成管理をおこなっていますが、chef-soloはサーバークライント構成を使わず、単体でプロビジョニングを行うことができるツールです。プロビジョニングツールには、chef以外にも、puppetなどが挙げられます。私自身がchefに慣れていたこと私の周りにchefを知っている人が多かったことくらいです。chefを勧めるわけではありません。chef以外に慣れているプロビジョニングツールがあれば、それを採用することをおすすめします。vagrantと連携できるプラグインがあるかどうかは確認しておいて下さい。(もしなければ、自分でプラグインを書くことになるでしょう)vagrantには、chefとpuppetを実行するためにプラグインが予め同梱されています。BerkshelfについてBerkshelfは、chefで使うクックブックを管理するgemです。必要なクックブックを、設定に従って集めて来てくれます。設定はBerksfileというファイルに下記のように書きます。'git@github.com:SpringMT/hoge.git'bundlerとGemfileと同じような関係ですね。server、ローカルのファイルなどからBerkshelfが自動的にクックブックを集めてきてくれます。Berkshelfを使うことによって、クックブックを分割して管理することができ、再利用性が高まるので、chefを使う際はオススメです。vagrantとchef-soloを使った環境構築を行う前にまず、vagrantとchef-soloを使う前に、これらツールを使う理由を整理しましょう。vagrant、chef-soloを使って環境構築を行うのか開発環境を構築するために、なぜvagrant、chef-soloを使うのでしょうか。vagrantを使うということは、自分のマシンにVMを立ち上げることになり、もう一台マシンが走っていることになります。その分だけ、ホストマシンに負荷がかかり動作が重くなるのは明白です。私個人の意見としては、開発環境構築にvagrantを使ってVMを立ち上げるよりは、ホストマシンだけで開発環境を構築できるのであれば、そうするべきだと思っています。現在、Macを使っていれば、Homebrewなどを使って様々なミドルウェアをインストールすることができます。Macであればローカルマシンの環境構築にはboxenを使うこともできます。今回vagrantを使ってVMを立ち上げることを選択したのでしょうか。それには、下記のようなローカルの環境では設定しにくい要因があったためです。特定のユーザーでなければ動かないアプリ特定のホスト名を設定しておかないと動かないアプリrootユーザーでしか作れないような、特定のディレクトリ構造が必要なアプリ上記のようなことをローカルマシンで実現できないわけではないのですが、ローカルマシンへの影響が大きすぎるため、vagrantとchef-soloを使ってVM上に環境構築することにしました。vagrantとchef-soloを使うための前提条件vagrantは、Mac、windows、Linuxの環境全て動きます。今回私が試した環境はMacのみなので、それ以外のOSでは動作確認をしていません。vagrantとchef-soloを使った環境構築の準備まず、vagrantとchef-soloを動かす設定を作ります。ローカルマシンの環境を整えるRubyのインストールここではRubyのインストールの仕方については細かく説明しません。rbenvやrvmを使ってインストールすることをおすすめします。びまでも紹介されているので参考になると思います。FirstStepRubyvagrantのインストールgemで配布されているvagrantは__使ってはいけません__。(rubygemsに登録されているvagrantはバージョンがかなり古いです)vagrantは、下記ページからOSにあったファイルをダウンロードしてインストールして下さい。Macの場合はdmgですね。http://downloads.vagrantup.com/vagrantのインストールが完了すれば、vagrantコマンドが使えます。vagrantコマンドを使って、Berkshelfと連携するプラグインをインストールしておきましょう。vagrant-berkshelfchef-soloと連携するプラグインはvagrantに同梱されているので、特にプラグインのインストールは不要です。他にも使いたいプラグインがあれば、各々インストールしてください。boxファイルの準備boxファイルは、vagrantでVMを立ち上げるためのベースとなるファイルです。vagrantのサイトで公開されているものもありますが、その中に自分が使いたいboxファイルがない場合や、個人で公開している野良boxファイルしか見つからず、自前でboxファイルを用意する必要がある場合があるかと思います。boxファイルを作ることになる場合、veeweeというツールを使うことがお勧めです。boxファイルを作る際は、boxファイルは極力シンプルにしておくと良いと思います。多くの人が使える状態にしておき、あとで、chef-soloで自分の好きな状態にするのが良いでしょう。作ってboxファイルの共有はどうしましょう。コピーして渡すには容量がそれなりに大きく、会社によってはUSBを使った共有もできない場合もあります。実は、ここが結構困ったところですが、結局自分はチームの全員がアクセスできるファイルサーバーにおいて、そこからダウンロードしてもらっています。vagrantの準備vagrantがインストールできていれば、vagrantコマンドが使えると思います。boxファイルをvagrantに登録します。'boxファイルのパス'ここで、_Vagrantfile_というファイルができていることを確認してください。Vagrantfileのサンプルは下記のとおりです。endend他にも、私の場合は、ネットワークの設定やsynced_folderの設定をしていますが、上記の設定だけでも十分に稼働可能です。chef-soloの準備まず、chefを使うための準備を行います。chef本体と、chefのクックブックを作るためのツールknife-soloをインストールします。knife-soloもちろん、bundler経由からインストールしても問題ありません。initしたディレクトリで下記コマンドを実行します。site-cookbooksこんな感じにディレクトリが作られると思います。それぞれの説明はchefを解説しているブログ等に譲りますが、ここで幾つか自分が取った方針について紹介しようと思います。クックブックの分割クックブックの再利用が困難になるため、site-cookbooksの中にはクックブックをほとんど入れませんでした。最小の単位でクックブックで作り、クックブックはそれぞれレポジトリを作って管理しました。それらを、Berkshelfでまとめて使えるようにしています。クックブックは、誰でも使える場所に公開しておき、再利用可能な状態にしておくことで、他に使いたい人が再発明しなくてすみます。site-cookbooksに入れたクックブックは、作りたい環境特有の設定を行うためのクックブックのみになっています。(このクックブックも、あとでシェアできるようになるべく分割しています)暗号化chefには、data_bagという仕組みを使って、公開したくないデータを暗号化して配布する方法があります。今回はその方法を採用しませんでした。その理由としては、下記二点がありました。開発環境の構築のみなので、パスワード等の暗号化は特に必要ないものだった鍵の配布は特に手間になるので暗号化したい場合は、鍵の配布の方法も合わせて考える必要があります。チームのほとんどが同じ鍵を持つことになるので、特に暗号化する必要がないと思い、今回は特に暗号化をしませんでした。クックブックの書き方ほとんどのクックブックは出回ってるクックブックと同じ書き方をしていますが、GH:EのリポジトリやGitHubのプライベートリポジトリをcloneしてくる部分が大分ハマったので、ここで紹介できればと思います。GH:EのリポジトリやGitHubのプライベートリポジトリからクローンしてくるこれは、ローカルマシンとvagrantとの連携技になります。Vagrantfileの設定で、sshのforward_agentをtrueにしてください。.end次に、ローカルマシンのssh/configの設定を行ってください。yesローカルマシンで、ssh-agentにGH:EもしくはGitHubで使ってる鍵を登録してください。cloneすることができます。このままだとVMからcloneするときにwarnningメッセージがでて実行が止まってしまうので、vagrantユーザーの.ssh/configに下記の設定を反映できるようなクックブックを書いて実行できるようにしておいてください。サンプルはこちらです。cloneすることができます。cloneした後に、cloneしてきたリポジトリをmvで移動したり、ユーザーを変えたりする必要があります。クックブックで表現すると下記のようになるかと思います。/home/user/test"endこの他に方法が無いかと色々試したのですが、この方法以外しか見つからず。installを実行してください。upを行えば、VMが立ち上がります。実際に環境を構築してもらうここまでできたら、他に人にも使ってもらえる準備が整いました。以下には、使ってもらったときに起きたトラブルとその解消方法を紹介します。upを実行中、結構な頻度でSEGVで落ちます。provisionを実行して再度chefを実行しましょう。(クックブックは冪等性を担保していることが前提となります。環境を更新するために、クックブックを修正することが多々あると思います。実行してBerksfile.lockを更新しましょう(よく忘れます。provisionを実行してもらい新しいクックブックを適用しましょう。errorがでて立ち上がらなくなることがあります。suspendで行うことを推奨します。haltと同じ現象が起こり、立ち上がらなくなる場合があります。suspendしてからホストマシンを落とすとよいでしょう。この場合、boot_timeoutの値を伸ばしてあげましょう。.endもともとはssh.timeoutだったのですが、名前が変わってハマりました。変更されたコミットまとめ開発環境構築はチームで開発を行う上で重要ではありますが、あまり時間を掛けたくないものです。この記事で、少しでも開発環境構築が楽になればと思います。(@Spring_MT)Fukuoka.rb所属(だったんですが、東京に引っ越したので現在は不定)Perlがメインの会社にいますが、今は主にRuby書いてます。