ようへいの日々精進XP

よかろうもん

chef-zero を構築して knife-xenserver と連携してみた一部始終

追記(2013.05.27)

認証周りについて、@urasoko さんより下記のように教えて頂きました。

.pem ファイル自体は必要なものの中身のチェックはされないようです。

現場での運用を考慮すると永続的な node 情報や cookbook 情報の保持等が懸念材料となるので、結局のところ Opscode の Chef Server になってしまうのかなと思ってしまったりしてます。

概要

  • 簡易軽量 Chef Server の chef-zero を使ってみる
  • 構築にあたってはこちらを参考にさせて頂いた
  • 構築後は knife xenserver から利用してみることにする

環境

役割 名前 環境
Chef Server chef-zero Debian 7 / apt-get にて rubyruby-dev をインストール
Chef Client XenServer 上の VM CentOS 6.4
Workstation X1Carbon Debian 7

構築

必要なパッケージのインストール

apt get install ruby ruby-dev libssl-dev

gem にてインストール

gem install chef-zero --no-ri --no-rdoc
Building native extensions.  This could take a while...
Fetching: mixlib-log-1.6.0.gem (100%)
Fetching: hashie-2.0.5.gem (100%)
Fetching: moneta-0.6.0.gem (100%)
Fetching: chef-zero-1.0.1.gem (100%)
Successfully installed puma-2.0.1
Successfully installed mixlib-log-1.6.0
Successfully installed hashie-2.0.5
Successfully installed moneta-0.6.0
Successfully installed chef-zero-1.0.1
5 gems installed

インストール出来た。

ヘルプを確認してみる。

root@debian:~# chef-zero -h
Usage: chef-zero [ARGS]
    -H, --host HOST                  Host to bind to (default: 127.0.0.1)
    -p, --port PORT                  Port to listen on
        --[no-]generate-keys         Whether to generate actual keys or fake it (faster).  Default: false.
    -l, --log-level LEVEL            Set the output log level
    -h, --help                       Show this message
        --version                    Show version

デフォルトはローカルホストのみのアクセスを受け付けるとのことなので全てのホストからアクセスを受けつけるように -H オプションで 0.0.0.0 を指定して chef-zero を起動する。

chef-zero -H 0.0.0.0
>> Starting Chef Zero (v1.0.1)...
>> Puma (v2.0.1) is listening at http://0.0.0.0:8889
>> Press CTRL+C to stop

Web サーバー(puma)が 8889 番で Listen して起動する。ちなみに puma は EngineYard 製の ruby で書かれた Web サーバーで puma の名のごとく動作が速いのが売りらしく、公式サイトでは消費メモリが他の Web サーバー(Unicorn 等)より少ないのも特徴らしい。

初期設定

knife.rb の chef_server_url に chef-zero の IP アドレスとポートを指定する。

chef_server_url          "http://xxx.xxx.xxx.xxx:8889"

chef-zero は @urasoko さんがこちらで書かれている通り、認証が不要とのことで、client_keyvalidation_key 等を無効化してみて試した。

まず client_key を無効化してみると...

knife client list
ERROR: Your private key could not be loaded from /etc/chef/client.pem
Check your configuration file and ensure that your private key is readable

こんな感じでエラーとなるので client_key は chef-zero サーバーにアクセスする為には必須のようだ。また、実際に VM を構築する段階で validation_key の設定を行なっていない場合には下記のようなエラーが出てしまう...。

Connecting to XenServer host xxx.xxx.xxx.xxx...
Creating VM chef-test-zero...
Using template hoge [uuid: 886cd33d-380d-ac9a-83ab-ba0a00c4b7e1]...
VM Name: chef-test-zero
VM Memory: 512 MB

Waiting server... 

Server IPs: xxx.xxx.xxx.xxx,xxxx::xxxx:xxxx:xxxx:xxxx

Waiting for sshd... 
Trying to SSH to xxx.xxx.xxx.xxx...  done
Bootstrapping Chef on xxx.xxx.xxx.xxx
ERROR: Errno::ENOENT: No such file or directory - /etc/chef/validation.pem

となるので、実際に chef-zero を介して chef を利用する場合には client_keyvalidation_key の項目としての設定は必須であるが、中身に関して特にチェックされていないように思われる。なぜなら、client_keyvalidation_key に指定されたファイルは Hosted Chef からダウンロードされたものなので、前述の通り、認証は不要と言えると思う。

動作確認の為 knife client list を実行してみる。

knife client list
chef-validator
chef-webui

上記の通り正常に結果が返ってくる。

cookbook をアップロードしてみる

以前に Hosted Chef に登録した hoge_cookbook を少し弄って登録してみる。

vim hoge_cookbook/templates/default/config.conf.erb

chef-zero で設定されたことが判るように...

welcome to chef-zero

そして chef-zero にアップロードする。

cd ${chef-repo}
knife cookbook upload hoge_cookbook -o ./

アップロード出来たようだ。

Uploading hoge_cookbook  [0.1.2]
Uploaded 1 cookbook.

念の為、登録されている cookbook を確認してみる。

knife cookbook list

アップロードされている。

hoge_cookbook   0.1.2

Hosted Chef と表示のされ方が同じだー。


knife-xenserver との連携

早速、実行してみる

満を持して knife xenserver を実行してみる。

knife xenserver vm create --vm-template 886cd33d-380d-ac9a-83ab-ba0a00c4b7e1 --vm-name chef-test-zero --vm-networks 'Pool-wide network associated with eth0' -r "recipe[hoge_cookbook]" -d chef-full

さらっと bootstrap が終わって chef-zero サーバーから cookbook が同期される。

xxx.xx.xx.xx Thank you for installing Chef!
xxx.xx.xx.xx Starting Chef Client, version 11.4.4
xxx.xx.xx.xx Creating a new client identity for chef-test-zero using the validator key.
xxx.xx.xx.xx resolving cookbooks for run list: ["hoge_cookbook"]
xxx.xx.xx.xx Synchronizing Cookbooks:
xxx.xx.xx.xx   - hoge_cookbook
xxx.xx.xx.xx Compiling Cookbooks...
xxx.xx.xx.xx Converging 1 resources
xxx.xx.xx.xx 
xxx.xx.xx.xx Recipe: hoge_cookbook::default
xxx.xx.xx.xx   * template[/tmp/config.conf] action create
xxx.xx.xx.xx 
xxx.xx.xx.xx     - create template[/tmp/config.conf]
xxx.xx.xx.xx         --- /tmp/chef-tempfile20130526-984-o5lrqf  2013-05-26 14:48:24.721241712 +0900
xxx.xx.xx.xx         +++ /tmp/chef-rendered-template20130526-984-1nk1y24        2013-05-26 14:48:24.720241712 +0900
xxx.xx.xx.xx         @@ -0,0 +1 @@
xxx.xx.xx.xx         +welcome to chef-zero
xxx.xx.xx.xx 
xxx.xx.xx.xx Chef Client finished, 1 resources updated

Name: chef-test-zero
IP Address: xxx.xx.xx.xx
Environment: _default
Run List: recipe[hoge_cookbook]
Done!

念の為、対象の node にアクセスして確認してみる。

ssh node
[root@vm01 ~]# cd /tmp/
[root@vm01 tmp]# ls
config.conf  yum.log
[root@vm01 tmp]# cat config.conf 
welcome to chef-zero

/tmp/ 以下に config.conf ファイルが作成されていて、welcome to chef-zero が確認出来た!

まとめ(追記:2013.05.27)

  • chef-zero は Hosted Chef や既存の Chef Server よりも簡単に扱えるところが良い
  • 結果として、今回のような knife プラグイン等のテストに気軽に使えるところも良い
  • また、node の管理自体がそれほど複雑に行わない場合には chef-zero でも十分実用的だと思われる。ちゃんと運用していくには node 管理や冗長化等を検討する必要がある
  • とすると、やっぱりテスト用途等に限定されてしまいそうである...