Docker+Chefで環境作り 2 ruby


前回からの続きです。

Docker + Chef で楽々環境作り

Docker+Chefで環境作り 1 PHP/Nginx

Ruby環境を構築する

Base、PHP、Nginxと来まして、Rubyのレシピを追加します。

クックブック作成。

[takeken@ubuntu]$ knife cookbook create ruby-env -o site-cookbooks

 

Berkfileに追記。

[takeken@ubuntu]$ vi Berksfile
cookbook 'ruby-env', path: "./site-cookbooks/ruby-env"

 

Docker.jsonのrun_listに追記。

[takeken@ubuntu]$ vi ./nodes/docker.json
"recipe[ruby-env]"

 

ベースにしたい環境は
Sinatra + ActiveRecord + MySQL で簡易アプリつくってみるこの作業の時に作ったものなのでrbenvから入れていきます。
参考書籍と同じですね。これは偶然なので良かったです。

レシピを書きます。Baseレシピでも基本的なパッケージを幾つか書いてあるので必要パッケージの残りを書きます。

git tar  sqlite-devel

書籍の順で進めていますが、ここらからAttributeがバシバシ出てきますね。
内容はRubyのバージョンとかちょっと変えています。

.bash_profileは1回前に作ったコンテナから拾ってきました。

[takeken@ubuntu]$ vi site-cookbooks/ruby-env/attributes/default.rb
default['ruby-env']['user'] = "takeken"
default['ruby-env']['group'] = "takeken"
default['ruby-env']['version'] = "2.1.5"
default['ruby-env']['rbenv_url'] = "https://github.com/sstephenson/rbenv"
default['ruby-env']['ruby-build_url'] = "https://github.com/sstephenson/ruby-build"

 

ではberks vendorしてビルドすな。
書籍で言うところのプロビジョニング。意味は一緒だと思います。

[takeken@ubuntu]$ berks vendor cookbooks
Resolving cookbook dependencies...
Fetching 'nginx' from source at site-cookbooks/nginx
Fetching 'php-env' from source at site-cookbooks/php-env
Fetching 'ruby-env' from source at site-cookbooks/ruby-env
Fetching cookbook index from https://supermarket.getchef.com...
Using nginx (0.1.0) from source at site-cookbooks/nginx
Using ruby-env (0.1.0) from source at site-cookbooks/ruby-env
Using php-env (0.1.0) from source at site-cookbooks/php-env
Using selinux (0.8.0)
Using yum (3.5.1)
Using yum-epel (0.5.3)
Vendoring nginx (0.1.0) to cookbooks/nginx
Vendoring php-env (0.1.0) to cookbooks/php-env
Vendoring ruby-env (0.1.0) to cookbooks/ruby-env
Vendoring selinux (0.8.0) to cookbooks/selinux
Vendoring yum (3.5.1) to cookbooks/yum
Vendoring yum-epel (0.5.3) to cookbooks/yum-epel

[takeken@ubuntu]$ sudo docker build -t base ./

 

うまくいきました(*´ω`)

[takeken@6b2190d709c9 ~]$ rbenv -v
rbenv 0.4.0-129-g7e0e85b

 

節目でGit Pushしときます。まだクセづいてないので気を付けます。

[takeken@ubuntu]$ git add .
[takeken@ubuntu]$ git commit -m "20141211:rbenv追加"
[master d57a3ec] 20141211:rbenv追加
 8 files changed, 139 insertions(+), 1 deletion(-)
[takeken@ubuntu]$ git push

 

Gitもそれだけで本が1冊できあがりますが、ちょいと戻したくてGit pullしたときに思った状態でなかったりしたことがありますが、そもそも使い方が間違っていたようですし、初心者はPullを使いなさんなという事もあるみたいですね。

参考サイト
Git pullを使うべきでない3つの理由 - DQNEO起業日記:

では、続きにいきます。
さきほどrbenvを入れて確認したとこまで進んだのでrbenvを使ってrubyを入れます。

ここでちょっとリソースについて振り返りと言うか簡単にまとめてみます。

packageパッケージの管理。ディストリは自動で判別してくれるみたい。
serviceサービスのstart、stop、restartとか。
template設定ファイルとか、外部ファイルを扱う。
directoryディレクトリの定義。
cookbook_file設定ファイルを扱う。静的に使う用途で分けるのが定石。
ipconfigネットワークインターフェースを定義する。
gitgithubで管理されているリポジトリを利用したり。
gem_packageRubyGemsのgemを扱う。使い方はpackageと同様。
executeコマンドの実行。not_if only_if と合わせる事が多い(らしい)。
script指定したインタプリタでスクリプトを実行。executeのactionも利用できる。

今まで出てきたリソースはこんなところでしょうか。

じゃ、いきます。

ruby-buildのインストールとrubyのインストールはさっき作ったレシピを修正するだけになります。下にあげた内容を追加するわけですな。

続いてruby-build
# git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
バージョン確認。
# rbenv install --list
最新の安定版を。
# rbenv install -v 2.1.5
バージョン指定して有効に。
# rbenv global 2.1.5
確認。
# ruby -v

書籍の内容に加えて、インストール済みのファイルがあったら有効にするリソースを加えました。

ruby-2.1.5を使う前提にしているので!もし2個以上あったらほしい結果にならない可能性はあると思うよ。

execute "rbenv global #{node['ruby-env']['version']}" do
        command "/home/#{node['ruby-env']['user']}/.rbenv/bin/rbenv global #{node['ruby-env']['version']}"
        user node['ruby-env']['user']
        group node['ruby-env']['group']
        environment 'HOME' => "/home/#{node['ruby-env']['user']}"
        only_if { File.exists?("/home/#{node['ruby-env']['user']}/.rbenv/versions/#{node['ruby-env']['version']}")}
end

編集してビルド。

[takeken@ubuntu]$ vim chef-repo/site-cookbooks/ruby-env/recipes/default.rb
[takeken@ubuntu]$ berks vendor cookbooks
[takeken@ubuntu]$ sudo docker build -t base ./

うまくいきました(*´ω`)

[takeken@ubuntu]$ sudo docker run -it base:latest /bin/bash
bash-4.1# su - takeken
[takeken@8d5881fdf533 ~]$ ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
[takeken@8d5881fdf533 ~]$

あとはgemでの環境作りなので、もう少しですね~。
ではgit pushしときませう。

[takeken@ubuntu]$ ls
Dockerfile  README.md  chef-repo
[takeken@ubuntu]$ git add .
[takeken@ubuntu]$ git commit -m "20141211:ruby2.1.5-rbenv 追加"
[master aef43e5] 20141211:ruby2.1.5-rbenv 追加
 1 file changed, 30 insertions(+)
[takeken@ubuntu]$ git push

ここで思ったのが、sinatraなコンテナを作ろうとしていたけれど、bundle execな環境で作業をする訳だから、全部プロビジョニングする訳にはアカンのでした。
置換、アカンと。

なので、ここで終わってもいいのですが、どうせなのでbundlerを入れるまでやります。
rbenv rehashもしてないし。

それと、前回はThinを使ったのですが、UnicornがNginxと連携できるようで、書籍ではUnicornをBundle execな環境に入れています。
せっかくNginxを入れているのでUnicornで進める方向でいきたいと思うので、Nginxのconfファイル修正までやって完了としたいと思います。
ついでついでと言いながら、たんに書籍に沿って進めているだけというのは秘密だ。

Nginxのenvに追加するrubyは、chef-repo/nodes/docker.jsonに追記します。

ではビルドいってみます。
ビルドの完走も最初は2分くらいだったものの、カーネルのビルドとまではいかないけれど、だいぶ時間を食ってしまうから実験も大変なんだな。

・・・7分かかりました。思ってたより短かった。

ではコンテナを起動して、railsを動かしてnginxとUnicornの連携を確認する作業をやってみます。

まずは色々なものがちゃんとインストールされているか確認。

[takeken@ubuntu]$ sudo docker run -d -p 22 -p 80 base:latest /usr/sbin/sshd -D
431710a0a464689575c3e109d261ce2717f53f345828d68986144beebbc1af7b
[takeken@ubuntu]$ ssh -p 49153 localhost
The authenticity of host '[localhost]:49153 ([::1]:49153)' can't be established.
RSA key fingerprint is 9d:b2:49:c4:69:90:3e:7f:f8:6e:cb:8c:c8:a5:67:cd.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:49153' (RSA) to the list of known hosts.
takeken@localhost's password:
[takeken@431710a0a464 ~]$
[takeken@431710a0a464 ~]$ gem -v
2.2.2
[takeken@431710a0a464 ~]$ bundle -v
Bundler version 1.7.9

問題なさげなので、進んでいきます。

[takeken@431710a0a464 ~]$ gem install rails -V
GET https://api.rubygems.org/latest_specs.4.8.gz
302 Moved Temporarily
GET https://s3.amazonaws.com/production.s3.rubygems.org/latest_specs.4.8.gz
200 OK
GET https://api.rubygems.org/quick/Marshal.4.8/rails-4.1.8.gemspec.rz
302 Moved Temporarily
GET https://au-m.rubygems.org/quick/Marshal.4.8/rails-4.1.8.gemspec.rz
200 OK
HEAD https://api.rubygems.org/api/v1/dependencies
200 OK
GET https://api.rubygems.org/api/v1/dependencies?gems=rails
200 OK
GET https://api.rubygems.org/api/v1/dependencies?gems=railties
200 OK
GET https://api.rubygems.org/api/v1/dependencies?gems=actionmailer
200 OK
GET https://api.rubygems.org/api/v1/dependencies?gems=activerecord

~~ 略 ~~

safe, tzinfo after 372 seconds
22 gems installed
[takeken@431710a0a464 ~]$

終わった!プロジェクトをつくるよ。

[takeken@431710a0a464 ~]$ rails new test_unicorn --skip bundle
         run  bundle exec spring binstub --all
* bin/rake: spring inserted
* bin/rails: spring inserted

もうちょいです。
ここからちょいと端折ってnode.jsはYumのレポジトリを追加してインストール。
unicornを起動してブラウザからアクセスしてチェック。

[takeken@431710a0a464 test_unicorn]$ unicorn -c config/unicorn.rb -D
[takeken@431710a0a464 test_unicorn]$

jaf0afjwf

動いた事にちょっとびっくりしたけれど、成功ってことだね。

あとは何とかなるだろう~。これで基本的なとこは一通りこなせた・・気がする。
もともとアプリ制作の為に簡単に環境を作ろうと思っていたところで、このままDockerとChefで環境構築だ!というものに嵌って、そればかりにかまっていたら本末転倒だ。
本末たけけんに改名してもいいくらいだ。

ヒャッハー、手順はコート化だ~~って色々と面白半分にやっているけれど、テストコードを全くやっていないアンバランスな状態が進んでいくのは、あまりいい感じがしないのです。

マイアンサーNO1でもいいじゃないとも思いますかね。

 

参考書籍

Chef実践入門 技術評論社

Similar Posts:


Leave a Reply

Your email address will not be published. Required fields are marked *