Chef を始める #2 – Chef Server に Node を追加して Recipe を実行する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

前回 は、Chef Server のインストールと、Workstation のセットアップまで行いました。
今回は、Node を Chef Server に登録して Recipe を実行するところまでやってみたいと思います。

Node の準備

新たに Node 用の EC2 インスタンスを立ち上げ、セキュリティグループで ssh を許可しておきます。
OS は Amazon Linux、インスタンスタイプは t1.micro で試しました。

Chef Client のインストール

EC2 にログインしたら、最初に Chef Client をインストールします。
前回は、RubyGems を使ってインストールを行いましたが、以下の方式でもインストール可能です。

$ sudo true && curl -L https://www.opscode.com/chef/install.sh | sudo bash
$ chef-client -v
Chef: 11.4.0 

インストールが終わったら、knfie コマンドでクライアントの設定を行います。
-s には、 Chef Server の URL を指定します。

$ sudo mkdir /etc/chef && cd /etc/chef
$ sudo knife configure client -s https://ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com ./

コマンドを実行すると、 上記で指定した Cherf Sever の URL やログ情報が記載された client.rb と validation.pem いうファイルが作られます。

$ ls
client.rb  validation.pem

client.rb を開き、node_name を追記します。
node_name は、Chef Server への認証時に使用される名前です。

$ sudo vim client.rb
log_level        :info
log_location     STDOUT
chef_server_url  'https://ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com'
validation_client_name 'chef-validator'
node_name        'web-server'

次に、validation.pem を開き、Chef Server 上にある chef-validator.pem の内容をコピーします。
これは Node の登録時に、最初のみ chef-validator クライアントの証明書を借りるために必要な作業です。
chef-validator は新しいクライアントを登録するための特別なクライアントです。

$ sudo vim validation.pem
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAuVC+mEkuYsT/RWYvJ+PuOQbE022BXNFFZ+rHMUcmWQXtIgwu
MqaJonSVIWAYrwqYmZwrb0dKLuHXd8C+3ICnmZy9dQ0LKTaRPSFGhfeDxTQjlwfK
AdXlRrXAzvmqPXC3yuBGY9XL1wOzYZaCjjWxx2aYtFpQv2RLr/mXvl+vSsYO4hpA
.....
-----END RSA PRIVATE KEY-----

Chef Server に Node として登録する

上記の手順が終わったら、以下のコマンドでこの EC2 インスタンスを Node としてChef Server 登録します。

$ sudo chef-client -c client.rb  

実行後、client.pem が保存されているのが分かると思います。
以降は、この証明書を使って Chef Server に認証する形になります。

$ ls
client.pem  client.rb  validation.pem

ブラウザで Chef Server を開くと、Node List と Client に登録されていることが分かりますね。

chef-node

chef-client

Workstation から Node に Run List を適用する

Run List は、Node に対してどんな Recipe や Role を適用するかのリストです。
Workstation から、この Run List を Workstaion 経由で、Node に適用します。

Cookbook の取得

今回使う Cookbook として、opscode の github に getting-started という非常に簡単なサンプルがありますので、これを Workstation 上に clone します。

$ cd ~/chef/chef-repo/cookbooks
$ git clone https://github.com/opscode-cookbooks/getting-started

clone した Cookbook の中身を確認すると、recipes ディレクトリの中に default.rb というファイルがあります。
このファイルに実際の Recipe が記述されていますが、この Recipe はホームディレクトリ以下に、chef-getting-started.txt を作成するだけのものです。

$ cd getting-started/recipes
$ cat default.rb
template "#{ENV['HOME']}/chef-getting-started.txt" do
  source "chef-getting-started.txt.erb"
  mode "0644"
end

source として template ディレクトリにある chef-getting-started.txt.erb が指定されています。
中身を確認してみましょう。

$ cd ../templates/default
$ cat chef-getting-started.txt.erb
Welcome to Chef!

This is Chef version <%= node[:chef_packages][:chef][:version] %>.
Running on <%= node[:platform] %>.
Version <%= node[:platform_version] %>.

タグで node の属性が指定されています。これは Chef Server 上で確認することができます。

node-attributes

Cookbook の Upload

今回は、この Cookbook をそのまま Chef Server に upload します。

$ cd ~/chef/chef-repo/cookbooks
$ knife cookbook upload getting-started -o .
Uploading getting-started [0.4.0]
Uploaded 1 cookbook.

次にこの Cookbook の中の Recipe を web-server の Node に、Run List として登録しましょう。
コマンドは次のようになります。

$ knife node run_list add web-server "recipe[getting-started]"
web-server:
  run_list: recipe[getting-started]

Chef Server から Run List と Recipe を確認

登録した Run List と Recipe が Chef Server に登録されていることを確認します。

chef-recipes

Node から Recipe を実行する

Run List に登録された Recipe を実行するために Node にログインして以下を実行します。

$ sudo chef-client
Starting Chef Client, version 11.4.0
[2013-04-22T16:59:10+00:00] INFO: *** Chef 11.4.0 ***
[2013-04-22T16:59:11+00:00] INFO: [inet6] no default interface, picking the first ipaddress
[2013-04-22T16:59:11+00:00] INFO: Run List is [recipe[getting-started]]
[2013-04-22T16:59:11+00:00] INFO: Run List expands to [getting-started]
[2013-04-22T16:59:11+00:00] INFO: Starting Chef Run for web-server
[2013-04-22T16:59:11+00:00] INFO: Running start handlers
[2013-04-22T16:59:11+00:00] INFO: Start handlers complete.
resolving cookbooks for run list: ["getting-started"]
[2013-04-22T16:59:11+00:00] INFO: Loading cookbooks [getting-started]
Synchronizing Cookbooks:
  - getting-started
Compiling Cookbooks...
Converging 1 resources
Recipe: getting-started::default
  * template[/root/chef-getting-started.txt] action create[2013-04-22T16:59:11+00:00] INFO: Processing template[/root/chef-getting-started.txt] action create (getting-started::default line 20)
 (up to date)
[2013-04-22T16:59:11+00:00] INFO: Chef Run complete in 0.174993316 seconds
[2013-04-22T16:59:11+00:00] INFO: Running report handlers
[2013-04-22T16:59:11+00:00] INFO: Report handlers complete
Chef Client finished, 0 resources updated

正常に終了したことを確認し、ファイルが作られたか確認します...

$ sudo cat /root/chef-getting-started.txt
Welcome to Chef!

This is Chef version 11.4.0.
Running on amazon.
Version 2013.03.

無事作成されていました!

まとめ

今回は、Node の追加と Recipe の実行までを行いました。
すごく簡単なサンプルだったので、Chef の便利さがなかなか実感出来なかったかもしれません。。
次回は、もう少し実用的な Cookbook を使ってみたいと思います。