hidemium's blog

日々学んだことをアウトプットする。

Chef SoloでRailsの環境構築を自動化する

Ruby on Railsの環境構築は、RubyのインストールRails のバージョンを指定してインストールするが必要でしたが、これらの作業をChef Soloで自動化してみました。

Chefを動かすにはCentOS6にChef Soloをインストールするが必要なので、まず先にやっておきます。
次にCookbookを作りますが、Opscode Communityに多くのCookbookが公開されているため、Cookbookを全て自作しなくてもある程度の環境構築はできてしまします。*1


公開されているCookbookを使うには、依存関係のあるCookbookをまとめてダウンロードしてくれるBerkshelfを使用します。

Berkshelfをインストールします。

$ gem install berkshelf

chef-repo配下にBerksfileを作成し、以下のようにCookbookを指定します。
Ruby on Railsの環境構築のため、今回はrbenvというCoookbookを使用します。
Opscode Community以外のCookbookを使用する場合は、以下のようにgit:~のように指定します。

$ cd chef-repo/
$ vi Berksfile
site :opscode

cookbook 'rbenv', git: 'https://github.com/fnichol/chef-rbenv'

berksコマンドを実行してCookbookをダウンロードします。
berksコマンドを実行するとBerksfile.lockが作成され、依存関係のあるCookbookが一覧で表示されます。

$ berks install

サーバにChefをインストールします。

$ knife solo prepare <ユーザ名>@<サーバのIPアドレス>

RubyのバージョンとRailsのバージョンを指定してインストールするには、下記のようにJSONファイルを作成します。*2*3

run_listには、実行するCookbookである、ruby_buildとrbenvを指定しています。
また、rbenvオブジェクトでAttributeのデフォルト値を上書きします。
今回は、インストール先のユーザ、Rubyのバージョン、rbenvのglobal設定、Railsのバージョンを指定しました。

$ vi nodes/<サーバのIPアドレス>.json
{
    "rbenv": {
        "user_installs": [
            {
                "user": "<ユーザ名>",
                "rubies": ["1.9.3-p545","2.0.0-p353"],
                "global": "1.9.3-p545",
                "gems":  {
                    "1.9.3-p545": [
                        { "name": "bundler" },
                        { "name": "rails",
                          "version": "~>3.0"
                         }
                    ]
                }
            }
        ]
    },

  "run_list":[
    "recipe[ruby_build]",
    "recipe[rbenv::user]"
    ]
}

サーバに対してchef-soloを実行します。

$ knife solo cook <ユーザ名>@<サーバのIPアドレス>

Ruby on Railsの環境構築ができたことを確認するため、サーバにログインし、Railsで新規アプリケーションを作成するの手順を実行し、「http://<サーバのIPアドレス>:3000」にアクセスできることを確認します。

*1:ただし、公開されているCookbookを単純に使用しただけでは、必ずエラーが発生するかと思います。エラーが発生した場合、エラーの内容やCookbookの中身を理解する必要があり、LinuxRuby・Chef・インストール対象のソフトウェア等の知識が求められるため、正直学習コストは低くないのではと思っています。

*2:Ubuntu 12.04で動作確認済み

*3:README.mdには多くの対応プラットフォームか書かれておりCentOSもおそらく可