シェルからChef-solo、knife-soloの勉強の過程


セミナーの時などにクラウドのAPIとシェルの組み合わせでサーバをセットアップするデモをお見せしていたのだが、作るのがなかなか大変だったので大人気なChefを利用してみようと考えました。

## 従来からの方法

従来から使っているリポジトリはこちら。

https://github.com/yuyalush/setup_ubuntu12.04_on_niftycloud


デモをお披露目する実機からRubyでサーバ構築を行っています。スクリプトの途中で、サーバにSSHで接続しgithubに置かれているシェルを呼びだしてセットアップを行っています。

## Chef化したい内容

主にやっていることは

- apt-getによるOSの更新
- 必要ライブラリのインストール
- Rubyのソースコード取得とコンパイル、インストール
- Railsのセットアップ
- デモアプリの自動生成と起動

という内容です。今回はこれら全てをChefで行いたいと思ってます。

### Vagrantについて

Chefの勉強をしていると出てくるVagrantというものがあります。Chefは環境構築の自動化を進められるので、自分のレシピを作ったりする時にはまっさらのVMが必要になってきます。IaaSを使うという手もありますが、開発時は自分の環境を使っておきたいというという方も多いでしょう。そこで、コマンドベースで指定のVMをネットからダウンロードしてくれたり、スナップショットをとってくれたりする便利ツールが「Vagrant」です。必須ではないですが、あると便利でしょう。

ちなみに私は用意して使い始めたのですが、公開されているどのUbuntuイメージもRubyが既にインストールされているものだったので利用をあきらめました。Rubyが入っていないイメージを作るのはまた今度ということで。

なおVagrantは今回の私の狙いでは使えませんでしたが、かなり便利です。[Vagrantで作るUbuntu-12.04環境](http://www.freia.jp/taka/blog/create-ubuntu-12.04-by-using-vagrant/index.html)で紹介されているステップが簡潔なのでお勧めです。

普通にVMなソフトでもできるのですが、自動化に組み込みやすいというところがポイントなものです。

## 勉強した流れ

まずChefがそもそも何なのかを勉強し、サンプルを見ながら作成していきました。
環境構築のスクリプトなので、一度流すと成功しても失敗しても初期状態とは違うものになります。そこでVagrantというツールも使おうと思っていました。
最初に参考にしたのは伊藤直也さんが書かれた「[入門Chef Solo - Infrastructure as Code](http://www.amazon.co.jp/gp/product/B00BSPH158?tag=yuyalush-22)」 でした。
こちらはChefに関する一通りの知識が網羅されており、お勧めです。
[達人出版会からも出ている方](http://tatsu-zine.com/books/chef-solo)だとＰＤＦ版が手に入ります。

あと、伊藤さんの著書で一通りのことが解るのですが、Chefの全体であったりは解説が少なめなので、るびまの[Chef でサーバ管理を楽チンにしよう！ (第 1 回)](http://jp.rubyist.net/magazine/?0035-ChefInDECOLOG)で補強しました。

こちらの記事も参考になります。[Chef Solo入門のメモ](http://qiita.com/items/e9fb238a5e4595b04946)


## 実際にやったこと

### 作ったもの１

IaaS上に１台Ubuntu12.04を立ち上げておき、そこでChefを起動させてはレシピを実行させ、書いてはエラーを取り除きを繰り返しました。

Chefの良い点は、シェルと違ってスクリプトがコケたときにどこでコケたかを教えてくれます。これはとても助かりました。

最終的にでき上がったものがこちら。
(https://github.com/yuyalush/demo_base)

他で公開されているレシピなどを使わないで、完全に自分で書いてみました。綺麗ではないですが、狙ってた状態はできあがります。

立ち上がった直後のUbuntu12.04へsshで接続して、一気にセットアップを終わらせるというのがポイントなので実行するためのシェルを掻きました。
(https://github.com/yuyalush/demo_base/tree/master/kickstart)

このシェルでChefの環境構築とレシピのコピーなどを行って実行をしています。

```
curl -L http://www.opscode.com/chef/install.sh | sudo bash
```

このコマンドはChefのインストールコマンドです。
ChefはRubyで動いているので、今回のセットアップに何か影響がないかと思っていましたが、上記のコマンドを使うとRubyを抱えてインストールが行われますがパスを通さないのでChef専用のRubyがインストールされるイメージです。

### 感想

概ね狙ったものはできましたが、なんかもっとカッコいい方法はないのかという気がします。そこで調べてみたところknife-soloというものがあるのが解りました。

### 作ったもの２

knife-soloを使ってリモート環境にChefのインストールとChef-soloの実行を行うというものを準備してみました。

https://github.com/yuyalush/demo-solo

セットアップしたいVMを作成した後に、``` knife solo prepare root@IPアドレス```を実行するとChefのインストールが行われます。
同時にnodesというフォルダに生成される"IPアドレス.json"というファイルへ実行したいレシピ名を記述し、最後に```knife cook root@IPアドレス```を実行するとセットアップが行われます。

knife-soloではレシピをRsyncでリモート先へコピーし、Chef-soloが実行されているとのことでした。

参考にした記事はこちら。

[knife-soloでLinux環境構築](http://d.hatena.ne.jp/masa21kik/20130210)

[chef-soloとknife-soloで手軽に環境構築をする](http://shrkw.hatenablog.com/entry/configure_with_chef-solo_and_knife-solo)

[開発メモ#5 : Amazon Linux で knife-solo を使って chef-solo 実行](http://getpocket.com/a/read/293851393)

### 感想２

かなりスッキリしました。
ただ一つ。IPアドレス.jsonに書き込むというのが邪魔です。
これがなければ、もっと綺麗なのに。
もう少しknife-soloを調べてみたいと思います。


## まとめ

概ね要件は満たせましたので、今度はクラウド側のAPIと連携する部分を何とかしたいなと思います。
こちらの記事ではfogというライブラリを使いEC2とChefを連携させています。(http://blog.vuksan.com/2010/07/20/provision-to-cloud-in-5-minutes-using-fog/)

また、Chefの提供元であるOPSCODEのページでは色々なクラウドベンダーとの連携に必要なPluginも公開されております。
(http://docs.opscode.com/plugin_knife.html)

この辺りをうまく使ってみたいと思ってます。
あと、今回作成したレシピが実行に１０分程掛かるのを短縮もしてみたいところです。