chroju.dev/blog

the world as code

Chef soloはじめの一歩

Capistranoでいろいろやったので今度はChef、正確にはChef solo。サーバー立てて最初にやること(ユーザー作成、sshd_configの設定、もろもろインストールとか)はだいたい決まっていると思うので、Chefで全部コード化してしまえたらやっぱり楽だなぁという思い。なおChefとCapistranoの境界線については、システム全体をまかなうのがChefであり、Capistranoはあくまでアプリ単位のデプロイに使うイメージでいる。rbenvやRubyを入れるのはChef。/var/www/RailsApp/配下(仮)をごにょごにょするのがCapistrano。

参考としたのはお馴染みのアレです。ただ、すでに出版から1年近く経っているので若干事情が変わっている箇所もあったりした。

入門Chef Solo - Infrastructure as Code
伊藤直也 (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なんだけど、どうもバグがあるっぽく上手くいかなかったのでバージョン指定で古いの入れてる。

セットアップ

初期設定。

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)

ここによれば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からインストールされる。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フォルダに入れるっていうルールもある。名前がわかりにくいが。

このへん押さえつつ、次回はレシピ作成編です。