Gosuke Miyashita about feed

ChefFirstImpression

5 May 2009

Puppet 作者 Luke Kanies 氏のブログエントリ にて、Puppet の競合となる Chef というソフトウェアについて触れられていた。

ソフトウェアのポジション的にも、使われている用語的にも、かなり Puppet を意識している模様。開発言語が Ruby という点も Puppet と同じ。

Luke 氏としては、Puppet を散々使っていながらあまりコードに貢献することなしに、新しいプロジェクトを立ち上げるってどうなのよ、とか、競合が存在するのはいいことなんだけど、 そんなたくさん競合がある分野じゃないんだから、もっと色々話してくれてもいいのに、といった不満があるみたい。

また、名前が SEO 的にまずいよね、自分もそれで苦労した、といったことや、Puppet が外部 DSL なのに対し、Chef は内部 DSL なんだけどそれってどうなのよ、的なことも書いてますね。自分も外部 DSL の方が、制限があるけどわかりやすくていいんじゃないかとは思ってます。

で、"I’m not afraid of competition." と言っていて、Puppet の競合なんて笑わせるぜ、的なことを言ってる(実際にこういうニュアンスかはよくわからないけど)わけですが、やはり気にはなるので試してみました。

最初は CentOS 5.2 で環境作ろうとしてたんですが、あまりにも面倒で挫折したので、 インストールガイド で対象としてる Ubuntu で試してみました。

インストール手順

今回はひとつの Ubuntu 8.10 VM 上で、サーバ/クライアント両方を兼ねる形でセットアップしました。基本的には インストールガイド にある通りなんですが、いくつか説明通りではうまくいかなかった点があるので、その点をここで補足しておきます。

「Install Ruby and Rubygems」では、libhttp-access2-ruby も合わせてインストールしておく必要があります。

$ sudo apt-get install ruby ruby1.8-dev rubygems build-essential libhttp-access2-ruby

また、「Bring up the Chef Server」にある、

$ sudo chef-solo -r http://wiki.opscode.com/download/attachments/1179839/chef-server-install-solo.tar.gz

ですが、これをそのまま実行しても、エラーが出て途中で止まってしまいました。この手順では、chef-solo というスタンドアローンな chef クライアントを使って、chef に必要となるパッケージをインストールし、初期化等を行っているのですが、runit パッケージと couchdb パッケージのインストール部分でこけてました。なので、まずは一度上記コマンドを実行してエラーが出た後に、この2つのパッケージを手動でインストールしておきます。

$ sudo apt-get install runit couchdb

それから、http://wiki.opscode.com/download/attachments/1179839/chef-server-install-solo.tar.gz の展開先にある二つのファイルを修正し、runit と couchdb をインストールしている部分をコメントアウトします。

/tmp/chef-solo/cookbooks/runit/recipes/default.rb

#  package "runit" do
#    action :install
#    notifies :run, resources(:execute => "start-runsvdir")
#  end

/tmp/chef-solo/cookbooks/chef/recipes/server.rb

#package "couchdb"

修正後、ファイルを tar.gz で固めます。

$ cd /tmp
$ tar cvf chef-solo.tar chef-solo
$ gzip chef-solo.tar

その後この tar.gz ファイルを指定して、chef-solo を走らせます。

$ sudo chef-solo -r /tmp/chef-solo.tar.gz

これでインストールは完了し、ウェブブラウザで 4000 番ポートにアクセスすることができるようになります。

Chef Repository の作成

インストールの次に行うのは、 Chef Repository の作成 です。Chef Repository とは、Chef でサーバ管理をするために必要な Cookbooks(Puppet でいうマニフェス)や設定ファイル等を管理するためのリポジトリです。

ここも基本的には Wiki の手順書 の通りなので、その通りに実行すればいいだけなんですが、いくつか補足を。

リポジトリの雛形を作成するところは、git clone してますので、当然 git が必要となります。なので、あらかじめインストールしておきます。

$ sudo apt-get install git git-core

rake new_cookbook してる手順ですが、これは cookbook の雛形となるファイルを生成してくれます。

$ rake new_cookbook COOKBOOK=apache
(in /home/mizzy/chef-repo)

** Creating cookbook apache

を実行すると、以下のようなディレクトリ/ファイルが生成されます。

$ ls -FR cookbooks/apache/
cookbooks/apache/:
attributes/  definitions/  files/  libraries/  recipes/  templates/

cookbooks/apache/attributes:

cookbooks/apache/definitions:

cookbooks/apache/files:
default/

cookbooks/apache/files/default:

cookbooks/apache/libraries:

cookbooks/apache/recipes:
default.rb

cookbooks/apache/templates:
default/

cookbooks/apache/templates/default:

例えば、cookbooks/apache/recipes/default.rb の内容は以下のようになってます。

#
# Cookbook Name:: apache
# Recipe:: default
#
# Copyright 2009, Example Com
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

rake install を実行すると、作成/編集した cookbooks を /var/chef/cookbooks の下に配置してくれたり、cofig/server.rb, client.rb, solo.rb を /etc/chef の下に配置してくれたりします。なので、雛形を git clone したままだと、勝手に設定が書き換えられるので注意が必要です。

実行時には、rake update (upstream リポジトリからの pull) と rake test も合わせて実行してくれ、sudo も自動的に実行してくれます。実行した結果は以下のようになります。

$ rake install
(in /home/mizzy/chef-repo)

** Updating your repository
Already up-to-date.
** Testing your cookbooks for syntax errors
Testing recipe /home/mizzy/chef-repo/cookbooks/apache/recipes/default.rb: Syntax OK
** Installing your cookbooks

Chef クライアント のサーバへの登録

Chef クライアントを動作させるためには、まずは Chef サーバへのノード登録が必要となります。手順は http://wiki.opscode.com/display/chef/Nodes#Nodes-RegistrationviatheWebUI の通りで、サーバの 4000 番ポートにブラウザでアクセスし、

  1. 右上の「Login」をクリックして、OpenID でログインする
  2. 上部の「Registration」をクリックする
  3. 対象となるノードの「Validation」をクリックする

で完了です。

ここで気になるのは、OpenID でログインするので、有効な OpenID アカウントさえ持っていれば、とりあえずログインできちゃうんですよね。なので、デフォルトで誰でもログインできちゃうような状態なんで、これはまずいだろ、と。

それから、 Nodes have OpenIDs のところを読むと、内部的に Chef サーバがノードを認証するための仕組みとしても OpenID を使っているみたいなんだけど、そのメリットとか意図がさっぱりわからない。

cookbook を 作成して Chef クライアントに適用する

サンプル cookbook の作成の仕方は、 Quick Start を参照すれば OK です。ここでは特に補足しません。

わかりにくいのが、作成した cookbook を特定のノードに適用する方法。Puppet だと以下のようなやつ。

node 'client.example.org' {
    include apache
}

これには ウェブ UI を利用する方法 chef-client コマンドを利用する方法 があります。

ウェブ UI の方では、上部メニューの「Nodes」をクリックし、該当するノードを選択。するとノードに関する詳細情報が表示されるので、適当なところをクリック。すると、テキストエリアに以下のように JSON 形式で内容が表示されて編集可能に。

{
  "name": "ubuntu",
  "_rev": "4279229607",
  "attributes": {
    "kernel": {
      "machine": "i686",
      "name": "Linux",
      "os": "GNU\/Linux",
      "version": "#1 SMP Thu Nov 20 21:57:00 UTC 2008",
      "release": "2.6.27-9-generic"
    },

    ... 中略 ...

    "uptime": "4 hours 56 minutes 03 seconds",
    "platform": "ubuntu",
    "block_device": {
      "ram13": {
        "size": "131072",
        "removable": "0"
      },

      ... 中略 ...

      "ram9": {
        "size": "131072",
        "removable": "0"
      }
    },
    "uptime_seconds": 17763
  },
  "json_class": "Chef::Node",
  "recipes": [

  ],
  "chef_type": "node"
}

この下のほうにある「recipes」ところに、適用したい cookbook を追加して、save すれば OK らしいのですが、うちの環境ではうまく save ができませんでした。

chef-client コマンドを使う方法では、

$ sudo chef-client -j node.json

といった形で、JSON ファイルをロードできるようなのですが、この方法でもうまくいかず、結局試すことができませんでした。また後ほど環境作り直して再チャレンジの予定。

まとめ

ここまでざっと使ってみた感想をまとめてみます。

今のところ、まだ Puppet からの乗換えを検討しようとは思わないけど、今後ウォッチしていこうと思います。