運用管理ツール?「Chef」をいろいろ使ってみます

Puppetとよく比較されるChefですが個人的にはPuppetの書き方がどうしてもなじめなかったのでChefをインストールしてみました。
ChefのWikiでインストール方法に書いてあるのでそこまではスキップします。(couchDBとかapache-solrとかRabbitMQとかMerbとか結構大変です。インストールだけみるとPuppetのが簡単だと思います。)

※今回chef-serverも自分のとこにいれようとしてます。chefの開発元がchef-serverをクラウド上に提供しているものは利用しません。(ただ、そっちを利用する方が簡単だと思います)
※参考サイト:http://wiki.opscode.com/display/chef/Hello+World+example

環境及び前提

COOKBOOKを作ってみます

まずはcookbookと呼ばれるものを作ってみます。
gitを前提としているのでopscodeさんが提供してくれてくれるレポジトリからcloneかけるのが一般的ですが僕が今回試した環境はそれができなかったので一度ダウンロードしてもってきてからgit initしました。

$ mkdir $CHEF_REPO/.chef
$ touch $CHEF_REPO/.chef/knife.rb

knife.rbを以下のように設定します。

cookbook_copyright "pochi_black"
cookbook_email "pochi.black@gmail.com"
cookbook_lisence "apachev2"
node_name "pochi" #=> OSのユーザ名

ここまでくると、cookbookが作成できるはずです!

$ cd $CHEF_REPO
$ knife cookbook create COOKBOOK
** Creating cookbook COOKBOOK
** Creating README for cookbook: COOKBOOK
** Creating metadata for cookbook: COOKBOOK

あんまりわかってないけどできました。/var/chef/cookbooks以下にそれっぽいものができました。

Chef-clientを動かしてみます

まだChef-Clientの設定を全く行ってないので起動できません。
sudo chef-clientとたたこうものならたちまちChef::Exceptations::PrivateKeyMissing Exceptionが発生します。
このあたりから独力でやるのは限界なのでid:rx7先生の教科書をたよりにします。

設定ファイルを生成する

最初に設定ファイル作れといわれてるようなので作ってみます。

$ cd $CHEF_REPO
$ knife configure client ./client-config

こうするとそれっぽいファイル(client.rbとvalidation.pem)ができるのですが、/etc/chef/validation.pemがありませんておこられますがここは無視しようと思います。
(先に/etc/chefディレクトリ作っておくとなにもいわれないようです)

chefの設定ディレクトリにコピー
$ cp -r $CHEF_REPO/client-config /etc/chef

さて本家のWikiではここでknife node listってうつと何も登録されてませんよという画面が出ましたが、私の環境では、client.pemがないよっていわれました。/etc/chef/validation.pemが悪い気がしてきたので以下のような設定をしてみます。

$ openssl genrsa -des 32 > /etc/chef/validation.pem
$ openssl rsa -in /etc/chef/validation.pem -out /etc/chef/validation.pem

それでもdata too large for key sizeとエラーが出ました。これはどうもopensslの制約ぽいです。

Chef-Serverを動かしてみます

いろいろ本家サイトをみているとどうもChef-Serverを自前で動かす場合は、Server側でユーザの管理が必要な気がしてきたので動かしてみます。(これが動かないとchef-clientもきっと動けないんでしょう)

${COUCHDB_DIR}/couchdb #=> couchdbの起動
${RABBITMQ_DIR}/rabbitmq-server start #=> rabbitmqの起動
${RABBITMQ_DIR}rabbitmqctl add_vhost /chef
${RABBITMQ_DIR}rabbitmqctl add_user chef testing
${RABBITMQ_DIR}rabbitmqctl set_permissions -p /chef chef ".*" ".*" ".*"
${GEM_BIN_PATH}/chef-solr-indexer #=> chef-solr-indexerの起動
${GEM_BIN_PATH}/chef-solr #=> chef-solrの起動
${GEM_BIN_PATH}/chef-server #=> chef-serverの起動

couchdbが動いていなくてエラーが発生しました。

couchdbを動かしてみます

couchdbだったので気づかなかったのですが起動がうまくいってなかったようです。
エラーを調べた結果以下のようなメッセージがでていました。

{'EXIT',
"libicuuc.so.44: cannot open shared object
file: No such file or directory"}

いろいろ調べた結果、以下の設定で動くようです。

$ LD_LIBRARY_PATH=/usr/local/lib
$ couchdb

また、デフォルトでは5984ポートで起動するのでそれも変更しておきます。
$COUCHDB_DIR/etc/couchdb/local.ini内にある[httpd]のportを設定して再度起動すればOKです。

再度chef-serverを動かしてみます

$ chef-server -e production

動きました。ぱちぱちぱち。
オプション(-e)はRailsでいうとRAILS_ENV(3.0ならRACK_ENVかな?)です。Merb昔ちょっと触ってたので懐かしいです。Merbのデフォルト起動ポートは4000ですね。

chef-server-webuiを動かしてみます

$ chef-server-webui -e production -p 8082

chef-serverで4000ポート使っているのでchef-server-webuiは違うの使いましょう。ここも何事もなく動きました。アクセスしてみるとデフォルトの初期ユーザ名とパスワードがレイアウト右に書いてあるのでそれでログインできます。

もう一回chef-clientに戻ってみます

nodeリストを見てみます。

$ chef-client
$ knife node list
[
 "server1"
]

うまく動いているようです!序盤で出たものはchef-serverがうまく動いていれば問題ないということにしておきます。
現状のknife.rbはこんな感じです。

loglevel :info
log_location STDOUT
node_name 'server1'
client_key '/opt/ruby/chef/repo/.chef/client.pem'
validation_client_name 'chef-validator'
validation_key '/etc/chef/validation.pem'
chef_server_url 'http://localhost:4000'
cache_type 'BasicFile'
cache_options(:path => '/opt/ruby/chef/repo/.chef/checksums')

ここまででやっとインストールができたという感じでしょうか。やっぱり環境構築が大変ですね。

COOKBOOKを使えるようにしてみます

やっと何となく動きそうな環境ができたので一番最初に作成したCOOKBOOKを登録してみます。
(knife cookbook upload -hでいろいろ出てきますけど)

$ knife cookbook upload -s http://localhost:4000/ -u sptoss1 -o /var/chef/cookbook/ -a
#=> chef-server(http://localhost:4000)に対してsptoss1ユーザ権限で/var/chef/cookbook以下にある全てのcookbookを登録してねというコマンドだと思います

Upload complete!が出力されればうまくいってるはずです。

Roleを作ってみましょう

本家Wikiの手順にのってるので作成してみます。

# ${CHEF_REPO}/roles/example.rb

name "example"
description "Example role for the chef repository"
run_list("recipe[zsh]", "recipe[screen]", "recipe[git]")

うーん、run_listには覚えのないrecipeが並んでる・・・

$ rake roles #=> roleを登録

ここで、403がでちゃいました。サーバ側のログをみるとapplication.rbのis_adminが影響しているみたい。
GUIからユーザをadminに変更するとうまくいきました。roleを設定するときはadminじゃないとだめみたいです。chef-server-apiのmerbアプリ一通りみればいろいろわかりそうな気がしてきました。