Chef soloはじめの一歩
Capistranoでいろいろやったので今度はChef、正確にはChef solo。サーバー立てて最初にやること(ユーザー作成、sshd_configの設定、もろもろインストールとか)はだいたい決まっていると思うので、Chefで全部コード化してしまえたらやっぱり楽だなぁという思い。なおChefとCapistranoの境界線については、システム全体をまかなうのがChefであり、Capistranoはあくまでアプリ単位のデプロイに使うイメージでいる。rbenvやRubyを入れるのはChef。/var/www/RailsApp/配下(仮)をごにょごにょするのがCapistrano。
参考としたのはお馴染みのアレです。ただ、すでに出版から1年近く経っているので若干事情が変わっている箇所もあったりした。
売り上げランキング: 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フォルダに入れるっていうルールもある。名前がわかりにくいが。
このへん押さえつつ、次回はレシピ作成編です。