CL LAB

HOME > CL LAB > Chef > Chef Development Kit 0.3.2を使ってみよう:基本編 #opschef_ja #getchef_ja

Chef Development Kit 0.3.2を使ってみよう:基本編 #opschef_ja #getchef_ja

 ★ 19

この記事は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の開発ツールであるChefSpecFoodcriticTest 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の時点ではbashzshshしか受け付けないようになっています。

新ワークフローツール“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:~$

このうち、cookbookrecipeattributetemplatefilelwrpは、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の構築と利用を容易にするものとして、今後の拡充が期待されています。
新しいワークフローの実験的機能であるポリシーファイルについては次回紹介します。


CL LAB Mail Magazine

CL LABの情報を逃さずチェックしよう!

メールアドレスを登録すると記事が投稿されるとメールで通知します。

メールアドレス: 登録

※登録後メールに記載しているリンクをクリックして認証してください。

Related post