Chefを試す

いまさらながら、Chefを試してみる。インストール後にやっていることは、SD10月号の id:rx7 さんの記事のとおり。突然使い始めた理由は、AWS上のインスタンスの管理のため。

構成

すべてVMWare Server上の仮想マシン。ネットワークはNATで構成。

  • Chefサーバ
    • CentOS6 (192.168.92.11)
  • Chefクライアント
    • CentOS5 (192.168.92.131)

EPELから必要なパッケージをインストールする

# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
# yum install couchdb erlang rabbitmq-server libxml2-devel zlib-devel.x86_64
# service couchdb start
# chkconfig couchdb start
# vi /etc/yum.repos.d/epel.repo
enabled=0

Chefサーバの設定

RBELリポジトリを利用してインストール

# rpm -Uvh http://rbel.frameos.org/rbel6
# vi /etc/yum.repos.d/rbel6.repo
enabled=0
# yum install ruby ruby-devel ruby-ri ruby-rdoc ruby-shadow gcc gcc-c++ automake autoconf make curl dmidecode
# yum install rubygem-chef --enablerepo=rbel6
# yum install rubygem-chef-server --enablerepo=rbel6
# /usr/sbin/setup-chef-server.sh


このままだと、rabbitmq-serverのきどうで失敗する。
ログを見てみると良くわからないが、ipv6が云々カンヌンと書かれているので、IPv6を無効にしてみる。

# vi /etc/modprobe.d/ipv6_disable.conf
options ipv6 disable=1
# vi /etc/sysconfig/network
NETWORKING_IPV6=no
# reboot

再起動して、上のスクリプトを実行するとうまいこと全部起動する。

# /usr/sbin/setup-chef-server.sh
Checking RabbitMQ...
Configuring RabbitMQ default Chef user...

Starting CouchDB...

couchdb を起動中:                                          [  OK  ]
Enabling Chef Services...

Starting Chef Services...

chef-server を起動中:                                      [  OK  ]
chef-server-webui を起動中:                                [  OK  ]
chef-solr を起動中:                                        [  OK  ]
chef-expander を起動中:                                    [  OK  ]


これにて、起動完了。
と思ったら、chef-serverとchef-server-webuiが起動していない。なぜ?
しばらく調べていてもわからず、しばらくして再度 /etc/init.d/chef-server{,webui} start を実行したら普通に起動した。。。


※翌朝確認したら、また落ちていた。その時のログなのかは定かではないが、以下のメッセージが出ている。

merb : chef-server (api) : worker (port 4000) ~ Failed to authenticate. Ensure that your client key is valid. - (Merb::ControllerExceptions::Unauthorized)


関係あるのかな?
だが、今はあまり時間が無いので、とりあえず理解のために先へ進む。


Chef-clientの設定

インストール

こちらもRBELを用いてインストールする。

# rpm -Uvh http://rbel.frameos.org/rbel5
# vi /etc/yum.repos.d/rbel5.repo
enabled=0
# yum install rubygem-chef --enablerepo=epel,rbel5

サーバへのアクセス

node_nameは必ずしもhostnameと一致している必要はないが、一致させたほうが運用上は良いと思われる。今回は特に気にせず設定してしまった。

server# scp /etc/chef/validation.pem 192.168.92.131:/etc/chef/
client# vi /etc/chef/client.rb
chef_server_url 'http://192.168.92.11:4000'
node_name       'centos5'
client# chef-client


コマンド実行後に、/etc/chef/client.pemが作成され、エラーが出力されていなければ、サーバに登録されている。

knife(コマンドライン操作ツール)

knifeの初期化
# knife configure
WARNING: No knife configuration file found
Where should I put the config file? [~/.chef/knife.rb]
Please enter the chef server URL: [http://test.mase.vm:4000] http://192.168.92.11:4000
Please enter an existing username or clientname for the API: [root] centos5
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef/validation.pem]
Please enter the path to a chef repository (or leave blank):
# ln -s /etc/chef/client.pem /root/.chef/centos5.pem

設定の確認
# knife node list
centos5

Chefのディレクトリ一式を作成する

Opscodeのgithubからディレクトリのひな形をダウンロードする。

# mkdir chef
# cd chef
# wget --no-check-certificate -O chef-repo.tar.gz http://github.com/opscode/chef-repo/tarball/master
# tar zxf chef-repo.tar.gz
# mv opscode-chef-repo-a3bec38 chef-repo

Cookbookを作る

knifeコマンドで、sampleという名前のcookbookを作成する。

# knife cookbook create sample -o ~/chef/chef-repo/cookbooks
 ** Creating cookbook sample
 ** Creating README for cookbook: sample
 ** Creating metadata for cookbook: sample
# ls chef-repo/cookbooks/sample
README.md  attributes/  definitions/  files/  libraries/  metadata.rb  providers/  recipes/  resources/  templates/

Recipeの作成~サーバへの登録

動作を確かめるために、実際にRecipeを書いてみる。

# vi chef-repo/cookbooks/sample/recipes/default.rb
template "/tmp/centos5.txt" do
    source "centos5.txt.erb"
    mode 0644
end
# vi chef-repo/cookbooks/sample/templates/default/centos5.txt.erb
Welcome to Chef!

CPU   :<%= node[:cpu][:"0"][:model_name] %>
Memory:<%= node[:memory][:total] %>
OS    :<%= node[:platform] %> <%= node[:platform_version] %>

Chef-serverへ登録してみる。
cookbookのuploadをする際に、クライアントがadmin権限を持っていないとauthorizeされないので、事前にadmin権限を付与しておく。
※server-webuiから行ったが、コマンドラインから行えるのだろうか。

# knife cookbook upload -a -o ~/chef/chef-repo/cookbooks/

Cookbookをnodeに紐付ける。

# knife node run_list add centos5 'recipe[sample]'

クライアントに反映する

先ほど登録して紐付けたcookbookを実際にクライアントに反映をする。

# chef-client
# cat /tmp/centos5.txt
Welcome to Chef!
   
CPU   :Intel(R) Core(TM) i5 CPU         650  @ 3.20GHz
Memory:514896kB
OS    :centos 5.7 

エラーが何も出なければOK。

Attributeを試す

Attributeはデフォルト値や共通値、ノード固有の値を定義するためのもの。

# vi chef-repo/cookbooks/sample/attributes/default.rb
# cat chef-repo/cookbooks/sample/attributes/default.rb
default[:memo] = "None."
# knife cookbook upload -a -o ~/chef/chef-repo/cookbooks/
# chef-client
# cat /tmp/centos5.txt
Welcome to Chef!
   
CPU   :Intel(R) Core(TM) i5 CPU         650  @ 3.20GHz
Memory:514896kB
OS    :centos 5.7
Memo  :None.


このノードにはmemoというattributeは設定されていないので、defaultで設定した「None.」が表示される。そこで、このノードのattributeを設定して見る。

# EDITOR=vi knife node edit centos5
{
  "normal": {
    "tags": [
     ],
    "memo": "This is a centos5 for chef test."
  },
  "name": "centos5",
  "chef_environment": "_default",
  "run_list": [
    "recipe[sample]"
  ]
}

# chef-client
# cat /tmp/centos5.txt
Welcome to Chef!

CPU   :Intel(R) Core(TM) i5 CPU         650  @ 3.20GHz
Memory:514896kB
OS    :centos 5.7
Memo  :This is a centos5 for chef test.

といった形で、設定したattributeが反映されていることが確認できる。


こんな感じで、簡単んなチュートリアルは完了。ここからどうやって本番運用に合わせていくかは、利用者のセンス次第ですよねorz

まずは、opscodeのgithubからとってきたcookbookを自分らの環境に合わせてカスタマイズしていくところから。


(追記:2012/02/06)
[http://blog.frameos.org/2011/07/07/chef-0-10-2-rpms-now-available-at-rbel-frameos-org/comment-page-1/#comment-1383]
ここにあるように、複数の3rd Party製rubygem-*パッケージをインストールしていると、chef-serverの起動に失敗するとのこと。新しけりゃいいってもんじゃないってことだ。