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の機能をもう少し掘り下げたものを説明します。