概要
Chef Development Kit (chef-dk)
https://downloads.chef.io/chef-dk/
https://github.com/opscode/chef-dk
は、chef及びchefの開発ツールをまとめてインストールし、統一されたインタフェースで使えるようにしたものです。
ここでは、chef-dkの大雑把な内容、chef-dkで何が使えるようになるのか、インストールする際の注意点について紹介します。
chef-dkの内容
chef-dkには、おなじみchef-clientやknife, chef-soloなどの他に、以下の開発用ツールが含まれています。
- Berkshelf : cookbook間の依存関係を管理するツール(cookbook用のbundlerのようなもの)
- Test Kitchen : VMを使ってcookbookの動作テストが行えるツール (VagrantやVirtualBoxは別途インストールする必要あり)
- ChefSpec : VMは使わずにcookbookのユニットテストが行えるツール
- Foodcritic : 静的にcookbookを解析し、文法チェックや望ましくない書き方をしている箇所を検出するツール
上記ツールの他に、cookbookの雛形を作成するツールもあります。
インストール
http://www.getchef.com/downloads/chef-dk
からMac, Linux(Ubuntu, RHEL), Windows(Comming soon...)用のパッケージがダウンロードできます。
ダウンロード後、ダブルクリックするなりdpkg -iでインストールするなりしてください。
chef dkの構成
chef-dkは、最近のchefパッケージと同様omnibus-chef形式になっており、chef-dkで使うruby環境をchef-dkの内部に持っています。このため、rubyを別途インストールせずにまたマシンのruby環境を汚さずにchefの開発環境を入れることができます。
Macの場合、/opt/chefdk以下にchefや先ほど挙げた開発ツールの他にruby本体もインストールされ、chefやknife, foodcriticなどのコマンドへの/usr/bin以下にシンボリックリンクが張られます。
簡単に構造を説明すると、
/opt/chefdk
├── bin # chef, knife, berks, foodcritic, kitchen等chef-dkのコマンド類が置かれ、
│ /usr/bin/chefにsymlinkが張られる
├── embedded
├── bin # ruby, rake, bundler, rspecなどの
chef-dkのruby環境で使うコマンド類が置かれる
(/usr/binにsymlinkは張られない)
ここで注意したい点として、/usr/binにchefやknifeなどのコマンドへのsymlinkが張られるため、
すでにgemで上記コマンドを入れている場合は、PATHの設定によってはchefdkのほうのコマンドが使われず、gemで入れたほうが使われてしまうことがあります。which knifeコマンドで確認してみてください。
chefdkの方を使う場合は、gemで入れたchefを消すか、/usr/bin以下が優先して使われるようにPATHの設定を変えてみてください。
chefコマンド
chef dkをインストールすると、chefコマンドが使えるようになります。
githubのREADMEによると、このコマンドはcookbookの開発・テスト・イテレーションを簡単に行えるようにためのコマンドになるようです。
今のところchefコマンドで可能なのは以下の通りです。詳細はgithubのREADMEを見てください。
chef generate
cookbookやrecipe, LWRP等を雛形から作成できます
chef gem
前述の通りchef-dkはruby環境をその内部に持っています。そのruby環境にgemを入れたり消したりするためのコマンドがchef gemです。
このコマンドでインストールしたgemは~/.chefdk/gem以下にインストールされます。
chef exec
chef dk内部のruby環境にPATHを通してコマンドを実行するためのコマンドです。
主な用途として、chefspecがあります。
chef dkにはchefspecが入ってはいるものの、chef dkのruby環境にインストールされたrspecからしか使えません。
さらに/usr/binにはそのrspecへのsymlinkは張られていないため、chefspecを使いたい場合は、
/opt/chefdk/embedded/bin/rspecを直接叩かなくてはいけませんでした。
https://github.com/opscode/chef-dk/issues/18
chef execコマンドはchefdk内のrubyやgem環境にPATHを通してコマンドを実行するため、
chef exec rspecと打ってやれば、chefspec入りのrspecが使えるようになります。
rspecだけでなく、chefdk内のrubyを使って何かしたい場合にも使えます。