運用管理ツール?「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
環境及び前提
- OS: Red Hat 5.4
- Ruby: 1.9.2
- chef-server, chef-clientともに同じサーバにいれてみます
- 基本的には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アプリ一通りみればいろいろわかりそうな気がしてきました。