データベース徹底攻略とWebアプリエンジニア養成読本

データベース徹底攻略 (WEB+DB PRESS plus)

データベース徹底攻略 (WEB+DB PRESS plus)

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

最近立て続けに楽しい本を読めて嬉しい限り。

Ruby on Railsチュートリアルの写経を始めました

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう
Vagrant+Chefで環境構築する方法がなんとなく理解できてきましたが、ただ環境を作るだけじゃもったいないのでRailsチュートリアルの写経を始めてみようと思います。環境は以下の通りです。

OS Windows7 x64
VirtualBox VirtualBox 4.3.8 for Windows hosts
Ruby ruby 1.9.3p484 (2013-11-22) [i386-mingw32]
Vagrant Vagrant 1.5.1
chef chef (11.10.4 x86-mingw32)
knife knife-solo (0.4.1)
berkshelf berkshelf (2.0.14)

VagrantとChefの導入についてはVagrant + Chefの導入 vol.1 - m-namikiの日記Vagrant + Chefの導入 vol.2 - m-namikiの日記で行ってますが、vagrant用のプラグインとberkshelfのインストールをしてなかったのでしておきます。

saharaのインストール

saharaは仮想サーバのスナップショットのようなものを作ることができるvagrantプラグインです。環境のロールバック、コミットが可能なので何かあった場合に簡単に変更を取り消すことができます。インストール方法は以下の通りです。

vagrant plugin install sahara

vagrant-omnibusのインストール

vagrant-omnibusは仮想サーバ起動時にChefがインストールされているかどうかをチェックして、インストールされていない場合は自動でインストールしてくれるvagrantプラグインです。環境構築を自動化したいのにそのために手動でChefをインストールするのは本末転倒なので非常にありがたいですね。インストール方法は以下の通りです。

vagrant plugin install vagrant-omnibus

Berkshelfのインストール

BerkshelfはChefのはcookbookの依存関係を管理するツール(らしい)です。まだhttp://community.opscode.com/からcookbookをダウンロードするのが楽になるくらいしか分かっていませんが、インストールしておきます。gemとして提供されているので以下の通りにインストールします。

gem install berkshelf --no-ri --no-rdoc

仮想サーバの作成

ここから仮想サーバの作成を行っていきます。

cd C:\Users\m-namiki\Documents\20_vagrant
mkdir rails3_tutorial
cd rails3_tutorial
vagrant init chef/centos-6.5

chef-repoの作成

Vagrantfileがある場所にchef用のリポジトリを作成します。

knife solo init chef-repo
cd chef-repo
knife cookbook create ruby_env -o site-cookbooks

Berksfileの編集

Berkshelfがインストールしてあるとknife cookbook時にBerksfileが作成されるので編集します。

// chef-repo/Berksfile
site :opscode
cookbook 'yum'
cookbook 'ruby_build'
cookbook 'rbenv'
cookbook 'nodejs'

rubyのインストールはrbenv+ruby_buildで行います。nodejsについては、rails serverを実行したときにJavaScriptランタイムがインストールされていないと言われたのでインストールします。で、Berkshelfの実行。

berks install --path cookbooks

これでcookbooks/以下にyumruby_build、rbenv、その他それらと依存関係があるcookbookがインストールされました。

site-cookbooks/ruby_env/recipes/default.rbの編集

続いてレシピの編集です。

# for install Ruby
include_recipe "rbenv::default"
include_recipe "rbenv::ruby_build"
include_recipe "rbenv::rbenv_vars"

service "iptables" do
  action [:disable, :stop]
end
log "done iptables stop."

# add the EPEL repo
yum_repository 'epel' do
  description 'Extra Packages for Enterprise Linux'
  mirrorlist 'http://mirrors.fedoraproject.org/mirrorlist?repo=epel-6&arch=$basearch'
  fastestmirror_enabled true
  gpgkey 'http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6'
  action :create
end

# add the Remi repo
yum_repository 'remi' do
  description 'Les RPM de Remi - Repository'
  baseurl 'http://rpms.famillecollet.com/enterprise/6/remi/x86_64/'
  gpgkey 'http://rpms.famillecollet.com/RPM-GPG-KEY-remi'
  fastestmirror_enabled true
  action :create
end

%w{sqlite-devel}.each do |p|
  package p do
    action :install
  end
end
log "done package install."

rbenv_ruby "1.9.3-p545" do
  ruby_version "1.9.3-p545"
  global true
end
log "done ruby install."

gem_package "rbenv-rehash" do
  action :install
end
log "done rehash install."

gem_package "rails" do
  action :install
  version '3.2.14'
end
log "done rails3 install."

rbenvでrubyをインストールした場合、gem install後に必ずrbenv rehashをしなければならないそうなので、それを回避するためにrbenv-rehashを一緒にインストールしておきます。

Vagrantfileを編集

最後にVagrantfileを編集します。以下は変更部分です。

# Railsのサーバ用ポート
config.vm.network "forwarded_port", guest: 3000, host: 3333

config.vm.network "private_network", ip: "192.168.33.10"
config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--memory", "1024"]
end

config.vm.provision "chef_solo" do |chef|
  chef.cookbooks_path = ["./chef-repo/cookbooks", "./chef-repo/site-cookbooks"]
  chef.add_recipe "yum"
  chef.add_recipe "rbenv"
  chef.add_recipe "ruby_env"
  chef.add_recipe "nodejs"
end

# この行追加
config.omnibus.chef_version = :latest

forwarded_portについては、rails server実行時にhttp://localhost:3000にアクセスしろと言われますが、そのままではアクセスできなかったので3333に変更しました。

起動

準備が整ったのでvagrant upで起動します。自分の環境だとrubyとnodejsのインストールにそれぞれ10分くらい掛かりましたが、無事インストールが完了して起動しました。

[vagrant@localhost ~]$ ruby -v
ruby 1.9.3p545 (2014-02-24 revision 45159) [x86_64-linux]
[vagrant@localhost ~]$ rails -v
Rails 3.2.14
[vagrant@localhost ~]$ node -v
v0.10.15

で、ここまでの状態を一旦コミットしておきます。

vagrant sandbox on
vagrant sandbox commit

これで何か変更を加えてもすぐに元に戻せるので安心です。

作成したVagrantfileやchef-repoを以下で公開してみました。
m-namiki/rails3-tutorial_environment · GitHub
写経したものはこっちに公開していきます。
m-namiki/rails3-projects · GitHub
実はこれをやってみたかった:)

GitHub実践入門

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

昨日夜受け取ったのでまだちょっと少ししか読めてませんが、ワクワクしながら読んでます。これに限らず最近買った書籍はみんな読むのが楽しいです。

Vagrant + Chefの導入 vol.2

入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code

前回の記事ではVagrantの導入までが終わったので、今回はChefを導入してみます。

Rubyのインストール

ChefはRubyで動作するプログラムなので、Rubyをインストールしておく必要があります。Windows環境へのインストール方法はこちらを参照してください。バージョンについては、自分は1.9.3-p484を使っていますが、最新は1.9.3-p545なのでそちらの方が良いかと思います。
また、DevKitというものも必要となりますので、そちらもインストールしておきます。インストール方法はこちらを参照してください。

Chefのインストール

続いてはChefのインストールですが、まずは周辺プロダクトを整理してみます。

プロダクト名 概要
chef-solo chefに同梱されている単体で動作するプロビジョニングツール*1
knife-solo chefのcookbookを作るためのツール
Berkshelf chefで使うcookbookを管理するgem

Chefはクライアント・サーバによる集中管理方式でサーバの構成管理を行えますが、スタンドアロン方式も可能です。chef-soloはそのスタンドアロン方式用のツールです。次にknife-soloはknifeのプラグインでchef-soloで利用するレシピの雛形を作成したり、リモートでレシピを実行できるようにするためのサブコマンドが使えるようになります。Berkshelfはcookbookの依存関係を管理するツールらしいですが、ちょっとピンときません。ここは追々調べてみようと思います。

コマンドプロンプトで以下のコマンドを実行します。

gem install chef
gem install knife-solo

cookbookの作成

インストールが完了したら、vagrant initしたディレクトリに移動してknife soloを実行します。前回の記事の例だとC:\Users\m-namiki\Documents\20_vagrant\10_sandboxになります。

cd C:\Users\m-namiki\Documents\20_vagrant\10_sandbox
knife solo init chef-repo

実行が完了するとchef-repoというディレクトリが作成され、その下の階層は以下のようになります。

C:\Users\m-namiki\Documents\20_vagrant\10_sandbox>tree chef-repo
C:\USERS\M-NAMIKI\DOCUMENTS\20_VAGRANT\10_SANDBOX\CHEF-REPO
├─.chef
├─cookbooks
├─data_bags
├─environments
├─nodes
├─roles
└─site-cookbooks

次に簡単なレシピを書いてみます。chef-repoに移動して、knife cookbookを実行します。

cd chef-repo
knife cookbook create sandbox -o site-cookbooks

実行が完了するとsite-cookbooks以下にsandboxというディレクトリが作成され、その中にも色々なディレクトリやファイルが作成されます。

C:\Users\m-namiki\Documents\20_vagrant\10_sandbox\chef-repo>tree site-cookbooks
C:\USERS\M-NAMIKI\DOCUMENTS\20_VAGRANT\10_sandbox\CHEF-REPO\SITE-COOKBOOKS
└─sandbox
    ├─attributes
    ├─definitions
    ├─files
    │  └─default
    ├─libraries
    ├─providers
    ├─recipes
    ├─resources
    └─templates
        └─default

recipes\default.rbというファイルがインストールするパッケージなどを記述するファイルです。まずは簡単にiptablesを停止・無効化するレシピを書いてみます。

#
# Cookbook Name:: sandbox
# Recipe:: default
#
# Copyright 2014, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

service "iptables" do
  action [:disable, :stop]
end

log "done iptables stop."

レシピの書き方等については伊藤直也さん(@naoya)の入門Chef Solo - Infrastructure as Codeを筆頭に、ググればたくさん出てくるのでここでは割愛します。そしてようやく次は実行ですが、残念、m-namikiは力尽きてしまった!ので、続きはまた今度。

*1:サーバー構築・管理を自動化するツール

Vagrant + Chefの導入 vol.1

今更ながらローカルで色々試せる環境が欲しいと思ったのでVagrantを導入してみようと思います。詳細な手順についてはググれば色々な方が書いた記事があるので、自分の作業メモとして残しておきます。

VirtualBoxのダウンロード&インストール

https://www.virtualbox.org/wiki/Downloads
上記URLからVirtualBox 4.3.8 for Windows hostsをダウンロードして、インストーラを実行。

Vagrantのダウンロード&インストール

http://www.vagrantup.com/downloads.html
上記URLからWindows版をダウンロードして、インストーラを実行。ファイル名はvagrant_1.5.1.msiです。

OSイメージのダウンロード&追加

https://vagrantcloud.com/discover/featured
Vagrantでは仮想環境で動作させるOSイメージをboxと呼んでいるようです。公式に用意されているboxファイルは上記URLから確認することができます。今回はchef/centos-6.5を利用します。以下のコマンドを実行。

vagrant box add chef/centos-6.5

途中でvirtualboxvmwareのどちらを使うかを聞かれるのでvirtualboxを選択します。後はダウンロードしてくるのを待つのみ。実行結果はこんな感じになります。

C:\Users\m-namiki\Documents\20_vagrant>vagrant box add chef/centos-6.5
==> box: Loading metadata for box 'chef/centos-6.5'
    box: URL: https://vagrantcloud.com/chef/centos-6.5
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) virtualbox
2) vmware_desktop

Enter your choice: 1
==> box: Adding box 'chef/centos-6.5' (v1.0.0) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/chef/centos-6.5/version/1/provider/virtualbox.box
    box: Progress: 100% (Rate: 1735k/s, Estimated time remaining: --:--:--)
==> box: Successfully added box 'chef/centos-6.5' (v1.0.0) for 'virtualbox'!

また、自分が利用したいboxが上記にない場合は、下記URLから探すことができます。
http://www.vagrantbox.es/
上記URLから利用したいOSを選択してダウンロードします。インストールしながらダウンロードも可能ですが、かなり時間が掛かるので先にダウンロードしておくと良いです。例えばCentOS 6.4 x86_64 Minimal (VirtualBox Guest Additions 4.2.16, Chef 11.6.0, Puppet 3.2.3)を利用したい場合、下記のURLにアクセスします。
http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box

次にダウンロードしたboxファイルを追加します。上記でダウンロードしたboxファイルを任意のディレクトリに置いて、以下のコマンドを実行します。centos64はbox名です。

C:\vagrant>vagrant box add centos64  CentOS-6.4-x86_64-v20130731.box
Vagrant1.4.Xから1.5.1へアップグレートした場合の注意点

こちらの公式ドキュメントにはアップグレードは上書きするだけとありましたが、自分の環境では上手くいきませんでした。vagrant initするとこんなメッセージが。

C:\Users\m-namiki\Documents\20_vagrant\22_sandbox>vagrant box add chef/centos-6.5
ruby: No such file or directory -- C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.4.0/lib/vagrant/pre-rubygems.rb (LoadError)

どうやらC:\HashiCorp\Vagrant\embedded\gems\gemsに「vagrant-X.X.X」というディレクトリが複数あると、先に読み込んだ方を使うようなので上記のディレクトリにvagrant-1.4.Xというディレクトリが残っている場合は削除した方が良さそうです。

初期化と起動

上記で追加したboxを使用して仮想環境を作成します。

cd C:\Users\m-namiki\Documents\20_vagrant\10_sandbox
vagrant init chef/centos-6.5

実行後Vagrantfileが作成されます。次に仮想サーバを起動します。

vagrant up

vagrantで起動した仮想サーバにはSSHで接続する必要があるので、SSHに対応しているターミナルから以下の接続情報で接続します。

username vagrant
password vagrant
private_key C:\Users\${username}\.vagrant.d\insecure_private_key
port 2222

これで仮想サーバを手に入れることができたので、次回からはChefによる環境構築をやってみようと思います。

VirtualBoxが起動しない場合

これは自宅PCの話なんですが、vagrant upしてもVirtualBox0x80070005というエラーを吐いて起動しないことがありました。どうやらWindowsコンポーネントサービスというのが影響しているようで、下記のURLを参考に設定したら正常に動くようになりました。エラーメッセージなんかもほぼ同じだったので、もし起動しないことがあったら参照してみると良いかもしれないです。
http://yyfor.blog.fc2.com/blog-entry-4.html

実践 VagrantとHTTPの教科書

実践 Vagrant

実践 Vagrant

いまさらですが、最近Vagrantにハマッてるので買ってみました。

HTTPの教科書

HTTPの教科書

こちらは会社の人に勧められたので基本に立ち返える意味で買ってみました。

メタルギア ソリッド V グラウンド・ゼロズ

買いました。マップ情報がアプリと連動するのがスゴイ!エンジニア視点だと通信量とか考えたくないけどw 下手っぴなのでまだクリアできてないですが、本編発売まで十分楽しめそうです。