はじめに
僕自身は環境構築が苦手なので、これを期に環境周りの構築をまとめてみた。
間違っている点や疑問点などもあるので、よければコメントでご指摘してもらえると幸いである。
なお、開発環境はMacです。
あとrails+mysqlの環境と書いてますが、railsの環境は別記事でcapistrano3について書く予定です。
rubyとmysqlまでは入るので、環境自体は完成しているはず・・・!
追記
capistrano3について書きました。
Chefって?
このページを見てる人は僕よりもスキルが高い人ばかりだと思うので、あえて説明する必要は無いと思うけど、、、念のため書いておく。
Chefはサーバーを構築するレシピを管理して、実施するツールである。
例えば自分のPCがあって、本番のWebサーバーが3台あってそれぞれに対してRailsが動く環境を作るとすると3台のサーバーにsshで入り込みyumとかapt-getとかをして構築してくことになる。
しかも、同じような案件があったら上記の作業を毎回行う必要が出てくる。
これを自分の手作業で行うと面倒臭いしミスが発生するかもしれ無い。
だったら対象サーバーを指定したら同じ事をしてくれるツールがあるといいよね?って事で作られたのがchefだ。(多分)
chefは構築手順をレシピとして残しておけるので、一部を変更してサーバー構築をしたいという時にも便利だし、後述するberkshelfなどを使えば他の人が作ったレシピを使えたりするので僕のようにサーバー構築が苦手な人でも簡単に使えるのが特長だ。
Macに必要なものを入れる。
環境開発をする際にお世話になったサイトはこちらです。
ほとんどこのままですが、SQLiteではなくMySQLで構築してます。
Vagrant
まずはこちらからVagrantをインストールする。
https://www.vagrantup.com/downloads.html
VirtualBox
こちらも同様にインストールする。
https://www.virtualbox.org/wiki/Downloads
この辺りで困る事は多分ないはず。
Vagrantのboxを追加する。
vagrantはVirtualBoxなどの仮想OSを簡単に管理できるツールだ。(多分)
例えばcentOSの仮想OSを入れたい場合は以下のように実行すれば出来上がる。
$ mkdir centos
$ cd centos
$ vagrant init opscode-centos-6.5 http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box
また、仮想OSをあらかじめ自分のPCにダウンロードだけしたい場合は以下のコマンドでできる。
$ vagrant box add opscode-centos-6.5 http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box
# や
$ vagrant box add centos65 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
# こんなフォーマット
$ vagrant box add [ボックスの名前(任意)] [取得URL]
※opscodeはchef社の前の名前らしい。なので、僕は無難にopscode-centos-6.5を使ってるけど、何が違うかはわから無い・・・。
追加したboxは
$ vagrant box list
で見ることができる。
また、追加したボックスから作成する場合はvagrantを作成したいディレクトに移動して以下のコマンドで出来上がる。
$ vagrant init [上記で設定したボックスの名前]
initコマンドはVagrantファイルを作成するだけで、実際に仮想OSを作成する場合は以下のコマンドを続けて実行します。
# 初回構築 or 起動
$ vagrant up
# 終了
$ vagrant halt
# 削除(これがあるので、環境構築に失敗しても気軽にやり直せる。)
$ vagrant destroy
vagrant-omnibusのインストール
これはvagrantにChef Client/Chef Soloがインストールされていなければ自動でインストールするものになります。(この辺の事は、後述のknife-soloって?を見てもらえると分かるかと。)
vagrantインストール後に以下のコマンドを実施します。
$ vagrant plugin install vagrant-omnibus
また、後で出てきますがVagrantファイル内に以下の記述を行う必要があります。
config.omnibus.chef_version = "バージョン"
# もしくは以下のように指定することで最新のバージョンを入れる。
config.omnibus.chef_version = :latest
参考:
http://www.ryuzee.com/contents/blog/6651
chefとknife-soloを入れる。
今回メインで使用するchefを入れます。
その際にknife-soloも一緒に入れておきます。
$ gem install chef
$ gem install knife-solo
knife-soloって?
knife-soloがよく分からなかったのでちょっと調べた。(今までは盲目的に使ってた。)
chefにはChef Serverというものがあり、これを使うと対象のサーバーはChef Serverへアクセスしてレシピを取得して自分のサーバーの中身を構築していくと言う事ができる。
Chef Serverを使うと多くのサーバーで同じ設定ができる上に、対象サーバー内にレシピを持つ必要もないのだが、、、ちょっと試しに使ってみようと思う僕みたいな人には敷居が高い。(Chef Serverも用意しなければなら無いし・・・。)
knife-soloは構築する対象サーバー内部にレシピを持ってきて対象サーバー内部でレシピを実行していくのでChef Serverがなくても対象サーバーがChef Serverのように振舞ってくれるので僕のような人や少ないサーバー管理をしている人にはもってこいの代物だ。
って理解であってるかな・・・?
berkshelfを入れる。
berkshelfはchefのレシピを管理してくれるツールだ。
一言で言うとrubyのbundleみたいなものだ。
とりあえず、入れてみる。
$ gem install berkshelf
使うためにはBerksfileを作る必要がある。
とりあえず適当なディレクトリに作ってみる。
$ mkdir chef-test
$ cd chef-test
$ vi Berksfile
使いたいレシピ(クックブック)を記述する。
source "https://supermarket.chef.io"
cookbook 'build-essential', '~>2.1.3'
cookbook 'git', '~>4.1.0'
cookbook 'rvm', '~>0.9.2'
cookbook 'mysql', "~> 5.3.6"
先ほどまでレシピって書いてたけど、ここに記述しているのはクックブックでクックブックの中にレシピが入ってる。
一つのクックブックに一つしかレシピが入って無い場合もあるけど、複数入っている事もある。
僕みたいな素人は中身を確認してから使ったほうが良いかも・・・。
作成したBerksfileのクックブックを自分のPCに落とす時は以下のコマンドを使う。
$ berks
と書いているけど、僕はこのコマンドを叩いた事が無い。
多分
~/.berkshelf/cookbooks/
にクックブックが作成されるのかな?(この辺の思想は多分gemのbundle installと同じだと思う。)
実行する場合は以下のように保存するディレクトリを指定する。
$ berks vendor cookbooks
これで実行したディレクトリ内にcookbooksができてその中にクックブックができる。
出来上がったcookbooksを見ると、以下のフォルダにレシピが詰まっている。
cookbooks/***/recipes/
# ***は入れたクックブック名
指定したクックブックを実行する時にレシピを指定しない場合はdefault.rbが実行される。
実際に実行してみる
ここまでが前段階です。
次からは実際に構築していきます。
まずはvagrantの設定ファイルにchefのレシピを追加して構築する手順を書いていく。
Vagrant+Chefで環境づくり
はまったところもありましたが、以下の手順で概ね問題なく動作しました。
Vagrantの設定ファイル作成。
vagrantの設定ファイルは後で作ってもOKです。
$ mkdir rails-test
$ cd rails-test
# 事前にBoxを追加しておく。(上記で行っている人は不要)
$ vagrant box add opscode-centos-6.5 http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box
# vagrantの設定ファイルを作成する。
$ vagrant init opscode-centos-6.5
クックブックをダウンロード
同フォルダにBerksfileファイルを作成します。
$ vi Berksfile
内容は以下のように記載します。
source "https://supermarket.chef.io"
cookbook 'build-essential', '~>2.1.3'
cookbook 'git', '~>4.1.0'
cookbook 'rvm', '~>0.9.2'
cookbook 'mysql', "~> 5.3.6"
MySQLは上記の"~> 5.3.6"のようにバージョンを記載しないと正しく動作しませんでした。
今回は5.5を入れますが、5.6でも入ると思います。
設定方法は後述します。
実際にクックブックをダウンロードします。
$ berks vendor cookbooks
rvmの疑問
rvmはrubyのバージョン管理だけど、ここでrbenvを指定してるサイトがほとんど見当たらなかった。
なんでだろうか?
rbenvはユーザー単位で設定ファイルが作成されてしまうから、Apacheとかと相性が悪いのかな・・・?(僕は昔rbenvでサーバー構築をして、どはまりをしてrubyを入れ直した経験がある・・・。)
確かrvmはrubyの実行パスを書き換えるだけのシンプルな実装だったと思うから、そっちのほうが相性が良いのかな??
Vagrantの初期設定
vagrantはchefと連携できるので、Vagrantファイル内にchefのレシピを書き込みます。
ただ、その前に幾つか設定する必要があるのでその説明を記載します。
$ vi Vagrant
ファイル内を以下のように記載します。
# Vagrantの設定です。`(2)`の部分はバージョンを指定します。
# 2015年9月現在では2を設定しておけば問題ありません。
Vagrant.configure(2) do |config|
# 使用しているboxを記載します。(Vagrantファイル作成時に自動的に作成されていると覆います。)
config.vm.box = "opscode-centos-6.5"
# 後述
config.vm.network "forwarded_port", guest: 3000, host: 4000
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.provider "virtualbox" do |vb|
vb.customize ["modifyvm", :id, "--memory", "1024"]
end
# vagrant-omnibusに記載した通りで、対象のサーバーで動かすchefのバージョンです。
config.omnibus.chef_version = :latest
end
private_network
vagrantを起動した後にWebサーバーを立ち上げても外部からはアクセスできません。
アクセスするためにIPアドレスを振る必要があり、ここで指定したIPアドレスでアクセスできるようになります。
ただし、このIPアドレスは自分PCからのみ有効なので自分以外の人にアクセスさせたい場合は以下の方法をとります。
※通常はこの設定のみで十分なはず。
forwarded_port
こちらの設定をしておく事によって、自分のPCにアクセスがあったポート番号をvagrantへ飛ばします。
例えば上記の設定の場合は
http://localhost:4000/
へアクセスした場合はvagrant内部の3000番ポートへフォワードされます。
これを使えば他のPCからvagrantへアクセスさせることができます。
なお、vagrantを外に公開する方法もありますがここでは言及しません。(僕が使わないため。ってか、大抵の人は使わないと思います・・・。)
virtualbox
各virtualboxの設定を記載できます。
こちらの説明がわかりやすかと思います。
また、詳細な設定方法はこちらが参考になりました。
Vagrantへchefを設定する
続いてchefのレシピを記載します。
# 上記に記載の通り。
config.omnibus.chef_version = :latest
# 以下を追加します。
config.vm.provision :chef_solo do |chef|
# 先ほどBerksfileでダウンロードしたクックブックを指定します。
chef.cookbooks_path = "./cookbooks"
# chef.add_recipeとの差がわからない・・・
chef.run_list = [
]
chef.add_recipe 'build-essential'
chef.add_recipe 'git'
chef.add_recipe 'mysql::server'
chef.add_recipe 'mysql::client'
chef.add_recipe 'rvm::system'
chef.json = {
rvm: {
user: "vagrant",
default_ruby: "ruby-2.2",
rubies: ["ruby-2.2" ]
},
mysql: {
service_name:"default",
version: "5.5",
server_root_password: 'root'
}
}
do
chef.run_list
こちらはchefで実行したいレシピを記載します。
chef.run_list = [
'build-essential',
'git',
...
]
と書けば動くはずです。(僕は使ってません。)
chef.add_recipe
chef.run_listとの差がわかりませんが、vagrantではこちらの記述方法が一般的のようです。
chef.add_recipe 'git'
と記載した場合はcookbooks/git/recipes/default.rbのレシピが実行されます。
MySQLにはdefaultのレシピがないため
chef.add_recipe 'mysql::server'
chef.add_recipe 'mysql::client'
のように記載して、サーバーとクライアントのプログラムを動かしてます。
以下のレシピが実行されます。
cookbooks/mysql/recipes/server.rb
cookbooks/mysql/recipes/client.rb
chef.json
こちらはchefで環境を設定する際に使用する設定内容です。
あまりわかってませんが、初めのrvmやmysqlで各クックブックに対しての設定内容を書き込めます。
MySQLのserver_root_passwordを書き忘れると、デフォルトのilikerandompasswordsとかになってしまいます。
また、ここでMySQLのバージョンを指定できます。
version: 5.6にすれば5.6が入ると思います。(未検証)
config.vm.provision
最後になりましたが、これは実行したいプログラムを指定します。
例えば、シェルを実行したい場合は以下のようになります。
config.vm.provision "shell", inline: "echo hello world"
Hello worldが出力されます。
Vagrantを起動する
さて、いよいよ今まで作った設定で仮想OSを作成して起動します。
$ vagrant up
これでしばらく待ってれば仮想OSが立ち上がります。
$ vagrant ssh
$ ruby -v
$ mysql -u root -p
等を行って、設定通りに作成されているか確認してください。
これで完了です。
設定ファイルを適用させる。
vagrant作成に設定ファイルを変更させたい場合は以下のように行います。(僕はあまりやらないけど・・・)
$ vagrant provision
Vagrantもしくはサーバーへchef-soloでレシピを流し込む環境づくり
こちらも書こうと思ったのですが、量が多くなったので別途記事を書きます!
初心者なので、ご指摘などがありましたらコメントまでお願いいたします。