Chef Development Kit 0.3.2を使ってみよう:基本編 #opschef_ja #getchef_ja
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
WorkstationではChef Development Kitを使おう
かつてChef Clientのインストール手順はプラットフォームごとに別々で、方法もまちまち(apt、RubyGems、インストーラ、etc...)だったため、大変面倒な印象がありました。そこにChef Client Omnibus Installerが登場し、さまざまなプラットフォームでのChef Clientのインストールが簡単化されました。/opt 以下にRubyなどの必要な環境をすべて内包し閉じ込めていた点も見逃せない要素でしょう。
さて、WorkstationにChefをインストールする際にChef Client Omnibus Installerを利用している方も多いと思います。しかし、これはあくまでChef Clientパッケージであり、Workstationで利用するには足りません。Chefのワークフローとして重要な地位にあるBerkshelf、Cookbookの開発ツールであるChefSpec、Foodcritic、Test Kitchenなどは後からインストールしなければいけません。しかもこれらはネイティブ拡張を持つRubyGemsパッケージに依存しており、Cコンパイラなどの開発環境が必要なため、Workstationを整えるのに大変面倒な場合がありました。
そこに登場したのがChef Development Kit (別名・略称ChefDK、Chef DK、Chef-DKなど表記ゆれあり) です。Chef Client Omnibus Installerには含まれていなかったBerkshelf、ChefSpec、Foodcritic、Test Kitchenなどをも含み、新たなChefワークフローの提供を目標に作られたchefコマンドを含むという意欲的なパッケージです。
Chef DK 0.3.2は次のパッケージを含んでいます。
- Ruby 2.1.3p242
- Chef Client 11.16.0
- Ohai 7.8.0.dev.0
- Berkshelf 3.1.5
- ChefSpec 4.0.1
- Foodcritic 4.0.0
- Test Kitchen 1.2.1
- その他依存するライブラリやRubyGems等
Chef開発環境にChef DKを使わない手はありません。是非Workstationにインストールしてお手軽さを実感してみてください。
Chef DKのインストール
Chef DKのインストールはInstall the Chef DKを参照してください。Chef DKのダウンロードはChef Downloadsから行えます。
ここでは仮想マシン上に構築したUbuntu 12.04 LTS (amd64)にChef DK 0.3.2をインストールしています。
ubuntu@ws:~$ sudo dpkg -i chefdk_0.3.2-1_amd64.deb
(Reading database ... 60953 files and directories currently installed.)
Unpacking chefdk (from chefdk_0.3.2-1_amd64.deb) ...
Setting up chefdk (0.3.2-1) ...
Thank you for installing Chef Development Kit!
ubuntu@ws:~$
インストールができたら、chef verifyコマンドで自己診断を行います。
ubuntu@ws:~$ chef verify
Running verification for component 'berkshelf'
Running verification for component 'test-kitchen'
Running verification for component 'chef-client'
Running verification for component 'chef-dk'
Running verification for component 'chefspec'
...
---------------------------------------------
Verification of component 'chef-dk' succeeded.
Verification of component 'berkshelf' succeeded.
Verification of component 'chefspec' succeeded.
Verification of component 'test-kitchen' succeeded.
Verification of component 'chef-client' succeeded.
ubuntu@ws:~$
すべてsucceededとなれば問題ありません。
/usr/bin には次のシンボリックリンクが生成されます。なお、いくつかはデッドリンクになっていますが気にしないでください。
ubuntu@ws:~$ ls -lF /usr/bin/ | grep /opt/chefdk
lrwxrwxrwx 1 root root 21 Nov 4 11:38 berks -> /opt/chefdk/bin/berks*
lrwxrwxrwx 1 root root 20 Nov 4 11:38 chef -> /opt/chefdk/bin/chef*
lrwxrwxrwx 1 root root 26 Nov 4 11:38 chef-apply -> /opt/chefdk/bin/chef-apply*
lrwxrwxrwx 1 root root 27 Nov 4 11:38 chef-client -> /opt/chefdk/bin/chef-client*
lrwxrwxrwx 1 root root 26 Nov 4 11:38 chef-shell -> /opt/chefdk/bin/chef-shell*
lrwxrwxrwx 1 root root 25 Nov 4 11:38 chef-solo -> /opt/chefdk/bin/chef-solo*
lrwxrwxrwx 1 root root 25 Nov 4 11:38 chef-zero -> /opt/chefdk/bin/chef-zero
lrwxrwxrwx 1 root root 23 Nov 4 11:38 fauxhai -> /opt/chefdk/bin/fauxhai*
lrwxrwxrwx 1 root root 26 Nov 4 11:38 foodcritic -> /opt/chefdk/bin/foodcritic*
lrwxrwxrwx 1 root root 23 Nov 4 11:38 kitchen -> /opt/chefdk/bin/kitchen*
lrwxrwxrwx 1 root root 21 Nov 4 11:38 knife -> /opt/chefdk/bin/knife*
lrwxrwxrwx 1 root root 20 Nov 4 11:38 ohai -> /opt/chefdk/bin/ohai*
lrwxrwxrwx 1 root root 23 Nov 4 11:38 rubocop -> /opt/chefdk/bin/rubocop*
lrwxrwxrwx 1 root root 20 Nov 4 11:38 shef -> /opt/chefdk/bin/shef*
lrwxrwxrwx 1 root root 22 Nov 4 11:38 strain -> /opt/chefdk/bin/strain
lrwxrwxrwx 1 root root 24 Nov 4 11:38 strainer -> /opt/chefdk/bin/strainer
ubuntu@ws:~$
Rubyの設定
ここで、利用しているRubyをwhich rubyなどで確認してみましょう。
ubuntu@ws:~$ which ruby
/usr/bin/ruby
ubuntu@ws:~$ /usr/bin/ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
ubuntu@ws:~$
これはシステムにパッケージで導入済のRubyです。
もしこれをChef DKが提供するRubyを利用するように変更したいなら、chef shell-initコマンドが便利です。PATH環境変数やGEM_*環境変数をChef DK用に設定してくれます。
まず、利用中のシェルを確認します。
ubuntu@ws:~$ echo $SHELL
/bin/bash
ubuntu@ws:~$
bashということがわかったので、chef shell-init bashとします。
ubuntu@ws:~$ chef shell-init bash
export PATH=/opt/chefdk/bin:/home/ubuntu/.chefdk/gem/ruby/2.1.0/bin:/opt/chefdk/embedded/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
export GEM_ROOT="/opt/chefdk/embedded/lib/ruby/gems/2.1.0"
export GEM_HOME=/home/ubuntu/.chefdk/gem/ruby/2.1.0
export GEM_PATH=/home/ubuntu/.chefdk/gem/ruby/2.1.0:/opt/chefdk/embedded/lib/ruby/gems/2.1.0
ubuntu@ws:~$
このような環境変数設定が行われることがわかります。ただし、この時点ではまだ設定が行われていません。
ubuntu@ws:~$ printenv PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
ubuntu@ws:~$ which ruby
/usr/bin/ruby
ubuntu@ws:~$
次のようにして反映させます。
ubuntu@ws:~$ eval "$(chef shell-init bash)"
ubuntu@ws:~$
ubuntu@ws:~$ printenv PATH
/opt/chefdk/bin:/home/ubuntu/.chefdk/gem/ruby/2.1.0/bin:/opt/chefdk/embedded/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
ubuntu@ws:~$ which ruby
/opt/chefdk/embedded/bin/ruby
ubuntu@ws:~$
これではログインし直すと設定が消えてしまうので、シェルの設定ファイルに書き込んでおきます。
ubuntu@ws:~$ echo 'eval "$(chef shell-init bash)"' >> ~/.bash_profile
ubuntu@ws:~$
この設定はユーザが常用するRubyがシステムからChef DKのものに変わってしまうため、問題が発生しないか確認の上で行ってください。
なお、Chef DK 0.3.2の時点ではbash、zsh、shしか受け付けないようになっています。
新ワークフローツール“chef”
前述の通り、Chefにおける新しいワークフローを提供する目的で、Chef DKはchefコマンドを含んでいます。わざわざchefと命名したことは、今後chefコマンドを中軸としたワークフローを標準としていきたいという目論見がうかがえます。ただし、Chef DK 0.3.2の時点ではまだまだ粗削りのように思います。実際にどのようなことができるのか見ていきましょう。
ubuntu@ws:~$ chef
Usage:
chef -h/--help
chef -v/--version
chef command [arguments...] [options...]
Available Commands:
exec Runs the command in context of the embedded ruby
gem Runs the `gem` command in context of the embedded ruby
generate Generate a new app, cookbook, or component
shell-init Initialize your shell to use ChefDK as your primary ruby
install Install cookbooks from a Policyfile and generate a locked cookbook set
push Push a local policy lock to a policy group on the server
verify Test the embedded ChefDK applications
ubuntu@ws:~$
各サブコマンドについて見ていきます。
公式ドキュメントはchef (executable)あるいはhttps://github.com/opscode/chef-dk/blob/0.3.2/README.mdとなりますので、そちらも参照してください。
chef verify
先に解説した通り、Chef DKの自己診断を行うコマンドです。
chef shell-init
先に解説した通り、Chef DKに含まれるRubyを利用するための環境変数設定コマンドです。
chef exec
Chef DKに含まれるRubyを利用するための環境変数を設定してコマンドを実行します。例えば、次のようになります。
env
ubuntu@ws:~$ diff -U 1 <(env) <(chef exec env)
--- /dev/fd/63 2014-10-29 03:05:54.229760597 +0000
+++ /dev/fd/62 2014-10-29 03:05:54.229760597 +0000
@@ -7,3 +7,3 @@
MAIL=/var/mail/ubuntu
-PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
+PATH=/opt/chefdk/bin:/home/ubuntu/.chefdk/gem/ruby/2.1.0/bin:/opt/chefdk/embedded/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
PWD=/home/ubuntu
@@ -15,2 +15,5 @@
SSH_CONNECTION=10.0.2.2 59659 10.0.2.15 22
-_=/usr/bin/env
+_=/usr/bin/chef
+GEM_ROOT="/opt/chefdk/embedded/lib/ruby/gems/2.1.0"
+GEM_HOME=/home/ubuntu/.chefdk/gem/ruby/2.1.0
+GEM_PATH=/home/ubuntu/.chefdk/gem/ruby/2.1.0:/opt/chefdk/embedded/lib/ruby/gems/2.1.0
ubuntu@ws:~$
which ruby
ubuntu@ws:~$ which ruby
/usr/bin/ruby
ubuntu@ws:~$ chef exec which ruby
/opt/chefdk/embedded/bin/ruby
ubuntu@ws:~$
ruby -v
ubuntu@ws:~$ ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
ubuntu@ws:~$ chef exec 'ruby -v'
ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-linux]
ubuntu@ws:~$
chef gem
Chef DKに含まれているRubyGems環境を操作するためのgemコマンドのラッパーです。これを用いて、Chef DKに含まれていないKnifeプラグイン、KitchenドライバやRubyアプリケーションなどをインストールすると、Chef DKのディレクトリではなく、ユーザのホームディレクトリの.chefdk/パス以下に配置されます。
chef generate
各種の雛形を生成するサブコマンドです。
ubuntu@ws:~$ chef generate
Usage: chef generate GENERATOR [options]
Available generators:
app Generate an application repo
cookbook Generate a single cookbook
recipe Generate a new recipe
attribute Generate an attributes file
template Generate a file template
file Generate a cookbook file
lwrp Generate a lightweight resource/provider
repo Generate a Chef policy repository
policyfile Generate a Policyfile for use with the install/push commands (experimental)
ubuntu@ws:~$
このうち、cookbook、recipe、attribute、template、file、lwrpは、knife cookbook createコマンドを個別化したものとさほど変わらないため省略します。ただし、chef generateでは別途「雛形の雛形」を指定することができます。詳しくは公式ドキュメントとchef-dk/lib/chef-dk/skeletons/code_generatorを参照してください。
chef generate app
「1Cookbookに1レポジトリ」と「すべてのCookbookを1レポジトリ」の中間にある実験的なchef-repoの雛形を生成します。詳しくは公式ドキュメントを参照してください。
ubuntu@ws:~$ chef generate app chef-repo-app
Compiling Cookbooks...
Recipe: code_generator::app
* directory[/home/ubuntu/chef-repo-app] action create
- create new directory /home/ubuntu/chef-repo-app
:
:
:
ubuntu@ws:~$
ubuntu@ws:~$ tree -a -I .git chef-repo-app/
chef-repo-app/
|-- .gitignore
|-- .kitchen.yml
|-- README.md
`-- cookbooks
`-- chef-repo-app
|-- Berksfile
|-- chefignore
|-- metadata.rb
`-- recipes
`-- default.rb
3 directories, 7 files
ubuntu@ws:~$
chef generate repo
まったく新規のchef-repoの雛形を生成します。git clone https://github.com/opscode/chef-repoで取得できるものとほぼ同じ構成です。
ubuntu@ws:~$ chef generate repo chef-repo
Compiling Cookbooks...
Recipe: code_generator::repo
* directory[/home/ubuntu/chef-repo] action create
- create new directory /home/ubuntu/chef-repo
:
:
:
ubuntu@ws:~$
ubuntu@ws:~$ tree -a -I .git chef-repo
chef-repo
|-- .gitignore
|-- LICENSE
|-- README.md
|-- Rakefile
|-- certificates
| `-- README.md
|-- chefignore
|-- config
| `-- rake.rb
|-- cookbooks
| `-- README.md
|-- data_bags
| `-- README.md
|-- environments
| `-- README.md
`-- roles
`-- README.md
6 directories, 11 files
ubuntu@ws:~$
chef generate policyfile
ポリシーファイルの雛形を生成します。次回「ポリシーファイル編」で取り上げます。
chef install / chef push
両者はポリシーファイル関連のサブコマンドです。次回「ポリシーファイル編」で取り上げます。
まとめ
簡単にChef Development Kitの内容を紹介しました。
Chef Workstationの構築と利用を容易にするものとして、今後の拡充が期待されています。
新しいワークフローの実験的機能であるポリシーファイルについては次回紹介します。