サーバの構築などを自動化するシステム管理自動化ツールChefを、少しだけ使ってみました。

今回は、

  1. Chefサーバ&クライアント
  2. Chefノード
    と言う2台構成を構築し、
    ノード側にはnginxのインストールとサービス開始を設定してみます。
    対象のサーバOSは、どちらもUbuntu11.10 Serverでやってみます。

この辺りのページを参考にしました。
http://wiki.opscode.com/display/chef/Home http://firn.jp/2011/12/05/chef-introduction

Chefサーバ&クライアントのインストール(1. Chefサーバ&クライアントでの作業)

OpscodeのAPTリポジトリを追加します

$ echo "deb http://apt.opscode.com/ `lsb_release -cs`-0.10 main" | sudo tee /etc/apt/sources.list.d/opscode.list

GPGキーを追加します

$ sudo mkdir -p /etc/apt/trusted.gpg.d
$ gpg --keyserver keys.gnupg.net --recv-keys 83EF826A
$ gpg --export packages@opscode.com | sudo tee /etc/apt/trusted.gpg.d/opscode-keyring.gpg > /dev/null

パッケージ更新とChefサーバをインストールします

$ sudo apt-get update
$ sudo apt-get install opscode-keyring
$ sudo apt-get upgrade
$ sudo apt-get install chef chef-server

インストール時に表示される「URL of Chef Server」では「http://localhost:4000」を設定します。
パスワードは任意で。

クライアントを設定します。

$ mkdir -p ~/.chef
$ sudo cp /etc/chef/validation.pem /etc/chef/webui.pem ~/.chef
$ sudo chown -R $USER ~/.chef
$ knife configure -i
WARNING: No knife configuration file found
Where should I put the config file? [~/.chef/knife.rb]
Please enter the chef server URL: [http://(ホスト名):4000] http://localhost:4000
Please enter a clientname for the new client: [(ユーザ名)] master
Please enter the existing admin clientname: [chef-webui]
Please enter the location of the existing admin client's private key: [/etc/chef/webui.pem] /home/(ユーザ名)/.chef/webui.pem
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef/validation.pem] /home/(ユーザ名)/.chef/validation.pem
Please enter the path to a chef repository (or leave blank):
Creating initial API user...
Created client[master]
Configuration file written to /home/(ユーザ名)/.chef/knife.rb

例えばこんな感じでクライアントのリストが出てくるようであればknifeのセットアップが出来ています。

$ knife client list
chef-validator
chef-webui
master

Chefノードのインストール(2. Chefノードでの作業)

Rubyとchefクライアントをインストールします。

$ sudo apt-get install ruby rubygems
$ sudo gem install chef --no-rdoc --no-ri

knifeを実行すると「no such file to load – json (LoadError)」とでちゃったので

$ sudo gem install json --no-rdoc --no-ri

Chefサーバから「/etc/chef/validation.pem」をコピーしてきます。

$ scp (ユーザ名)@(chefサーバ):/etc/chef/validation.pem ./
$ sudo mkdir /etc/chef
$ sudo mv validation.pem /etc/chef/validation.pem

Chefノードの設定を行います。

$ sudo knife configure client ./
$ sudo mv client.rb /etc/chef/
$ sudo vi /etc/chef/client.rb
$ cat /etc/chef/client.rb
log_level :info
log_location STDOUT
chef_server_url 'http://(chefサーバ名):4000'
validation_client_name 'chef-validator'

Chefサーバに接続してみます

$ sudo chef-client
[Sat, 24 Dec 2011 02:25:19 +0900] INFO: *** Chef 0.10.8 ***
[Sat, 24 Dec 2011 02:25:19 +0900] INFO: Client key /etc/chef/client.pem is not present - registering
[Sat, 24 Dec 2011 02:25:19 +0900] INFO: HTTP Request Returned 404 Not Found: Cannot load node ubuntu

↑こんな感じで、サーバ側にノードが設定されていないという情報が出力されながら、何も実行されず一通り終わります。
ここでサーバ側にノードの情報が登録されるようです。

レシピの作成(1. Chefサーバ&クライアントでの作業)

以下のコマンドでレシピ(のひな形)を作ります。

$ sudo mkdir -p /var/chef; sudo chmod 777 /var/chef
$ knife cookbook create nginxsv
** Creating cookbook nginxservice
** Creating README for cookbook: nginxservice
** Creating metadata for cookbook: nginxservice

レシピの中身を記述します。ここではnginxのインストールとサービスとしての登録を指定。

$ sudo vi /var/chef/cookbooks/nginxsv/recipes/default.rb
package "nginx" do
action :install
end
service "nginx" do
supports :status => true, :restart => true, :reload => true
action [ :enable, :start ]
end

作成したレシピをサーバに登録します。

$ knife cookbook upload nginxsv

ノード名を「knife node list」で調べ、作成したレシピをノードに割り付けます。

$ knife node run_list add (ノード名) recipe[nginxsv]

レシピの適用(2. Chefノードでの作業)

ノード側でもう一度クライアントを実行すると、インストールやサービスの設定が行われます。

$ sudo chef-client

ブラウザでノード側に接続すると「Welcome to nginx!」と表示されて、nginxがインストールされていることが確認できると思います。

という感じで、chefのサーバとノードへの適用までを駆け足で試してみました。
まだまだ、chef-soloでレシピを作ったり、ノード側で自動的にレシピが適用されるように設定したり
などなどをしないと実用的には使えないと思いますが。今日はひとまずさわりだけ。。