---
categories: "Chef solo"
comments: true
date: "2014-05-06T00:00:00+09:00"
title: "Chef soloはじめの一歩"
---
Capistranoでいろいろやったので今度はChef、正確にはChef solo。サーバー立てて最初にやること(ユーザー作成、sshd_configの設定、もろもろインストールとか)はだいたい決まっていると思うので、Chefで全部コード化してしまえたらやっぱり楽だなぁという思い。なおChefとCapistranoの境界線については、システム全体をまかなうのがChefであり、Capistranoはあくまでアプリ単位のデプロイに使うイメージでいる。rbenvやRubyを入れるのはChef。/var/www/RailsApp/配下(仮)をごにょごにょするのがCapistrano。
参考としたのはお馴染みのアレです。ただ、すでに出版から1年近く経っているので若干事情が変わっている箇所もあったりした。
伊藤直也 (2013-03-11)
売り上げランキング: 2,821
## 基本構成
chefの基本構成を取りあえず押さえる。
* chef: インフラ自動化のフレームワーク
* chef solo: 本来クラサバ構成で扱うChefをスタンドアロンで使えるようにしたもの
* knife-solo: リモートからchef soloの実行に必要なツール
* Berkshelf: サードパーティクックブックの管理に使う
## インストール
上記のものを全部インストール。Gemfile書いてる場合はそっちに追加で。また最後に`rbenv rehash`を忘れずに。
```
gem install chef -v 11.10 --no-ri --no-rdoc
gem install knife-solo --no-ri --no-rdoc
gem install berkshelf
rbenv rehash
```
ちなみにChefの最新はv11.12.xなんだけど、どうもバグがあるっぽく上手くいかなかったのでバージョン指定で古いの入れてる。
* 参考:[Chef 11.12.2のknife configureが失敗する - Qiita](http://qiita.com/sakatuba@github/items/1548818b02735b2047ad)
## セットアップ
初期設定。
```
knife configure # 対話は全部デフォでOK
knife solo init chef-repo # chef-repoフォルダがレポジトリとして作られる
cd chef-repo
```
chef soloを使うリモート側へもchefをインストール。
```
$ knife solo prepare vagrant@192.168.1.1
```
## Berkshelf
続いてBerkshelfの初期設定。
```
$ berks init
```
しかし、ここでまさかのエラー。。。
```
cannot load such file -- hitimes/hitimes (LoadError)
```
[ここ](https://github.com/copiousfreetime/hitimes/issues/17)によればgem updateしてからhitimesを再インストールすれば大丈夫だよ的な話。やってみる。
```
$ gem update
$ gem -v
2.2.2
$ gem install hitimes
$ rbenv rehash
```
気を取り直して。
```
$ berks init
The resource at '/Users/chroju/Dropbox/lab/chef/vagrant-repo/metadata.rb' does not appear to be a valid cookbook. Does it have a metadata.rb?
```
('A`)ヴァー
わけわからんし、`berks init`しなくてもBerkfile自前で作りゃイケるらしいので諦めることにする。Berksfileを`touch`してからvimで編集。
```
site :opscode
cookbook 'sudo'
cookbook 'iptables`
```
Gemfileと似たような書き方で、`cookbook 'hoge'`と書くとそのクックブックが[Opscode](http://community.opscode.com/)からインストールされる。Opscode以外のGitHubで公開されているクックブックを使う場合は、これもGemfileのように`cookbook 'fuga' git:"..."`の形でURL指定が可能。
そしていざインストール……だがまたしてもエラー。
```
$ berks install --path cookbooks
DEPRECATED: `berks install --path [PATH}` has been replaced by `berks vendor`.
DEPRECATED: Re-run your command as `berks vendor [PATH]` or see `berks help vendor`.
```
そろそろこのあたりから笑えてきた。調べたところ、Berkshelf v3.xでは`berks install --path hoge`は使えないらしいス。`berks vendor hoge`が今どきらしい。
```
$ berks vendor cookbooks
destination already exists /Users/chroju/Dropbox/lab/chef/vagrant-repo/cookbooks. Delete it and try again or use a different filepath.
```
えー。
```
$ rm -rf cookbooks
$ berks vendor cookbooks
DEPRECATED: Your Berksfile contains a site location pointing to the Opscode Community Site (site :opscode). Site locations have been replaced by the source location. Change this to: 'source "http://api.berkshelf.com"' to remove this warning. For more information visit https://github.com/berkshelf/berkshelf/wiki/deprecated-locations
Resolving cookbook dependencies...
Using iptables (0.13.2)
Using sudo (2.5.2)
# 以下略
```
文句言いながらもやってくれました。冒頭の1行目の書き方は`site :opscode`というのが通例だったけど、v2.0から`source "https://api.berkshelf.com"`に変わった模様。ただ、コマンドは通るには通るんだけど。
最初に`berks vendor cookbooks`したときに出たエラー、要は「すでにあるフォルダにはインストールできねーよ」って話なのだが、だとしたらBerksfileを書き換えて追加インストールしたいときはどうしたらいいんだろう?というのは素朴な疑問。サードパーティのクックブックは直接編集しない(変数などは自分のレシピの方で代入する)のが基本らしいので、一度フォルダを消してから再度`berks vendro cookbooks`でも不都合はないと言えばないのだが、なんだか馬鹿らしい感じもする。
あと`berks install`コマンドもあるんだけど使い方わかってない。
## レシピ作成
その前におさえる基本。
* nodes/hostname.json : 実行するレシピをrun_listとして記述
* solo.rb : chefが利用する各種パスの設定ファイル(knife soloの場合は生成されない)
* cookbooks/hoge/recipes/default.rb : レシピ本体
* cookbooks/hoge/templates/default/* : テンプレートファイル
* cookbooks/hoge/files/* : 静的ファイル
* cookbooks/hoge/attributes/* : 変数の格納
あとcookbooksフォルダはサードパーティ製のものを入れて、自家製のクックブックはsite-cookbooksフォルダに入れるっていうルールもある。名前がわかりにくいが。
このへん押さえつつ、次回はレシピ作成編です。