Chefを使ってみる(2)

前回書いた記事「Chefを使ってみる」ではChefのインストールから、knife ec2を使ってインスタンスを起動するところまでを書きました。

今回は、cookbookを作って、実際にサーバの構成を変更するところを書きます。

(このブログでは、chefのサーバとクライアントモデルにつてい説明します。chef-soloを使う場合は少し違います)

その前に、cookbookとは何かというと、とある構成を作るための手順をまとめたものと解釈しています。
とある構成とは、例えばApacheのようなミドルウエアとか、自分で開発したアプリケーションだったり、それぐらいの単位を指していると。
cookbookには、1つ以上のrecipeが含まれており、構成を作る上で必要となるtemplate、ファイルも含めることができます。

ま、実際にcookbookを使ってみて理解するのが早いかなと。

Chefの元々の目的は、簡単にサーバを構築したりアプリケーションの配布を行えることなので、これらを行なうにあたって、実際には多くのcookbook,recipeを作っていくことになります。
opscodeのgithubにはそれらをバージョン管理ツールを使って管理出来るようにリポジトリのテンプレートが用意されています。
http://docs.opscode.com/essentials_repository.html

今回はChefのサーバ上にこのテンプレートをダウンロードしてきます。

git clone git://github.com/opscode/chef-repo.git
cd chef-repo

knifeの操作に必要な情報をリポジトリ内にコピーしてくる。

mkdir .chef
cp ~/.chef/chefuser.pem .chef/
cp ~/.chef/validation.pem .chef
cp ~/.chef/knife.rb .chef/

.chef/knife.rb というファイルに、knifeで操作する際の各種設定を書いておきます。
前回にも~/.chef/knife.rb として作成しましたが、ここのはcookbookを作成したり、作業するときに利用される値を設定します。
http://docs.opscode.com/config_rb_knife.html

例)
~/.chef/knife.rb

og_level                :info
log_location             STDOUT
node_name                'chefuser'
client_key               '/home/ubuntu/chef-repo/.chef/chefuser.pem'
validation_client_name   'chef-validator'
validation_key           '/home/ubuntu/chef-repo/.chef/validation.pem'
chef_server_url          'http://localhost:4000'
cache_type               'BasicFile'
cache_options( :path => '/home/ubuntu/.chef/checksums' )
cookbook_copyright       'sparkgene'
cookbook_email           'hoge@sparkgene.com'
cookbook_license         'apachev2'

cookbookを作る際の基本情報(会社名とかauthorの情報とか)を設定出来ますので、毎回cookbookを作ったあとに手で修正するのが面倒であれば、事前に書いておくといいでしょう。

以降は、apacheをインストールするcookbookを作ることで説明してきます。

では実際に作って行きましょう。

knifeコマンドを使ってcookbookの作成。
http://docs.opscode.com/knife_cookbook.html#create

cd /home/ubuntu/chef-repo
knife cookbook create apache2 -o cookbooks

** Creating cookbook apache2
** Creating README for cookbook: apache2
** Creating CHANGELOG for cookbook: apache2
** Creating metadata for cookbook: apache2

cd cookbooks/apache2

ここで、ディレクトリを見ると、以下のファイルやディレクトリが作成されます。
今後実際に使っていく際に説明していきますが、とりあえずドキュメントへのリンクだけw

chef-repo/cookbooks/apache2

  CHANGELOG.md
  README.md
  attributes/
  definitions/
  files/
  libraries/
  metadata.rb
  providers/
  recipes/
  resources/
  templates/

では、実際にレシピを書いて行きます。

recipes/default.rb

package "apache2" do
  package_name apache2
end

以上。
え?

まー、とりあえず実行できるように、色々操作します。

Cookbook の構文をチェックする

knife cookbook test -o /home/ubuntu/chef-repo/cookbooks apache2

Running syntax check on apache2
Validating ruby files
Validating templates

Cookbook をサーバにアップロードする

knife cookbook upload -o /home/ubuntu/chef-repo/cookbooks apache2

Uploading apache2        [0.1.0]
Uploaded 1 cookbook.

アップロードが終わりました。

確認してみます

knife cookbook list

apache2   0.1.0

ちゃんと登録されてます。

けど、これはまだサーバに登録しただけです。

次に、どのサーバに対して、このcookbook適用するかを指定します。
前回の続きだと、chefnode1というのがいるので、

knife node list

chefnode1

このノードに作成したcookbookを紐付けます。

knife node run_list add chefnode1 "recipe[apache2]"

chefnode1:
  run_list: recipe[apache2]

確認してみましょう

knife node show chefnode1

Node Name:   chefnode1
Environment: _default
FQDN:        ip-1-1-1-1.ap-northeast-1.compute.internal
IP:          1-1-1-1
Run List:    recipe[apache2]
Roles:       
Recipes:     
Platform:    ubuntu 12.04
Tags: 

ちゃんと設定されましたね。

では、chefnode1サーバにログインして、以下のコマンドを実行します。

sudo chef-client

Starting Chef Client, version 11.4.0
resolving cookbooks for run list: ["apache2"]
Synchronizing Cookbooks:
  - apache2
Compiling Cookbooks...
Converging 1 resources
Recipe: apache2::default
  * package[apache2] action install
    - install version 2.2.22-1ubuntu1.2 of package apache2

Chef Client finished, 1 resources updated

確認してみると

ll /etc/apache2
total 80
drwxr-xr-x  7 root root  4096 Mar  9 07:20 ./
drwxr-xr-x 88 root root  4096 Mar  9 07:20 ../
-rw-r--r--  1 root root  8346 Feb  7  2012 apache2.conf
drwxr-xr-x  2 root root  4096 Mar  9 07:20 conf.d/
-rw-r--r--  1 root root  1322 Feb  7  2012 envvars
-rw-r--r--  1 root root     0 Mar  9 07:20 httpd.conf
-rw-r--r--  1 root root 31063 Feb  7  2012 magic
drwxr-xr-x  2 root root  4096 Mar  9 07:20 mods-available/
drwxr-xr-x  2 root root  4096 Mar  9 07:20 mods-enabled/
-rw-r--r--  1 root root   750 Feb  7  2012 ports.conf
drwxr-xr-x  2 root root  4096 Mar  9 07:20 sites-available/
drwxr-xr-x  2 root root  4096 Mar  9 07:20 sites-enabled/

ちゃんとインストールされました。

けど、一つ疑問が。。
わざわざサーバに入って「sudo chef-client」って実行するのって、100台セットアップするとなったら、、
((((;゚Д゚))) ガクプル

そんなわけないです。同じ操作が先ほどcookbookの作成をしていたサーバ上からもできます。
もう一度、Chefのサーバの方に戻って、以下のコマンドを打ちます。

knife ssh "name:chefnode1" "sudo chef-client" -x ubuntu -i /home/ubuntu/.ssh/MY_KEY.pem

ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Starting Chef Client, version 11.4.0
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com 
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com resolving cookbooks for run list: ["apache2"]
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com 
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Synchronizing Cookbooks:
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com 
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com   - apache2
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com 
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Compiling Cookbooks...
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com 
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Converging 1 resources
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com 
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Recipe: apache2::default
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com 
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com   * package[apache2] action install
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com  (up to date)
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com 
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Chef Client finished, 0 resources updated
ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com

サーバからも出来ました!

今回実行したコマンドについて説明します。

knife ssh "name:chefnode1" "sudo chef-client" -x ubuntu -i /home/ubuntu/.ssh/MY_KEY.pem

knifeのサブコマンドsshに対して、一つ目のパラメータ「"name:chefnode1"」は、対象となるノードを選択するためのクエリーです。
クエリーをもう少し勉強して見るには、knife searchコマンドを使うと、意図したノードが取得できているか確認できます。

例えば、次のコマンドを入力すると、nodeというインデックスに対して、「'platform:ubuntu'」というクエリーで検索します。

knife search node 'platform:ubuntu'

2 items foundNode Name:   ip-1-1-1-1.ap-northeast-1.compute.internal
Environment: _default
FQDN:        ip-1-1-1-1.ap-northeast-1.compute.internal
IP:          1.1.1.1
Run List:    
Roles:       
Recipes:     
Platform:    ubuntu 12.04
Tags:        

Node Name:   chefnode1
Environment: _default
FQDN:        ip-2-2-2-2.ap-northeast-1.compute.internal
IP:          2.2.2.2
Run List:    recipe[apache2]
Roles:       
Recipes:     apache2
Platform:    ubuntu 12.04
Tags: 

まとめ

簡単なrecipeを作成して実際に実行してみる事で、ChefのServerとClientの関係が見えてきたかと思います。

  • Chefサーバは、cookbookや、nodeの情報を管理します。
  • node(サーバ)は、chef-clientプログラムを介して、自分の情報をサーバに登録して、自分があるべき姿を取得します。
  • 自分があるべき姿とは、cookbookのrecipeとしてChefのサーバで管理されている。
  • 実際に、cookbookに書かれている情報で自分をあるべき姿にするにはchef-clientの役目。


次回は、cookbookやrecipeの機能をもう少し掘り下げたものを説明します。