Chef Soloの入門として、Knife SoloとAmazon EC2を使ってのセットアップの練習です。Chefの取っ付きにくさは、最初に色々なファイルやフォルダを用意する必要があるところだと思います。そこをKnife Soloは、コマンド1つで初期設定してくれます。ということで、Knife Soloで使い方を覚えるというのは良い選択肢だと思います。今回は、次のようにクライアントからKnife Solo経由でChef Soloを流しこんで、サーバの設定を行う構成になっています。

Amazon Linux AMIの起動
EC2のウィザードから、Amazon Linux AMIを起動します。今回利用したバージョンは、Amazon Linux AMI 2013.03です。インスタンスサイズは何でも良いので、試すだけであればMicroインスタンスで充分です。セキュリティグループなど適時設定してください。

後々使いやすいように、~/.ssh/configにaws-knifeでログイン出来るように設定もしておきます。
host aws-knife hostname 99.99.99.99 user ec2-user identityfile ~/.ssh/your_keypair.pem
knife-soloのインストール&初期設定
knife soloのインストールと初期のレポジトリの作成を行います。下記の例ではrvmをつかっていますが、必要に応じてsudo等を使ってください。
$ gem install knife-solo $ knife solo init chef-repo $ ls cookbooks nodes site-cookbooks data_bags roles solo.rb
knife solo initを行うと5つのディレクトリが自動で生成されます。それぞれの役針は下記のとおりです。さしあたっては、site-cookbooksとnodesの2つを使えば充分です。
- cookbooksは、第三者が作ったクックブックをダウンロードして格納する場所。
- site-cookbooksは、自分が作ったクックブックを格納する場所。
- nodesは、ノードごとに実行するJSONファイルを格納する場所。
- data_bagsは、ユーザごとに定義したJSONファイルを格納する場所。
- rolesは、ノードの役割ごとにグルーピングの定義をしたJSONファイルを格納する場所。
サーバ側の設定の準備を行います。aws-knifeというのはサーバ名です。任意の名前を使ってください。(IPアドレスやFQDNでも大丈夫です。)
$ knife solo prepare aws-knife
WARNING: No knife configuration file found
Bootstrapping Chef...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 6471 100 6471 0 0 6452 0 0:00:01 0:00:01 --:--:-- 7805
Downloading Chef for el...
Installing Chef
warning: /tmp/tmp.F9iGP0Es/chef-.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
Preparing... ########################################### [100%]
1:chef ########################################### [100%]
Thank you for installing Chef!
Generating node config 'nodes/aws-knife.json'... 実行するとchefのrpmをダウンロードして、nodesの下にノード名.jsonというファイルを作成します。
レシピの作成
それではいよいよレシピを作成します。入門Chef Soloにならってnginxのレシピを書きます。
まずknife cookbook createコマンドでレシピのひな形を作ります。-oは、作成するフォルダの指定です。
$ knife cookbook create nginx -o site-cookbooks WARNING: No knife configuration file found ** Creating cookbook nginx ** Creating README for cookbook: nginx ** Creating CHANGELOG for cookbook: nginx ** Creating metadata for cookbook: nginx
recipies/default.rbに命令群を書きます。インストールするパッケージと、起動設定、テンプレート(設定ファイル)の指定をしています。
site-cookbooks/nginx/recipes/default.rb
package "nginx" do action :install end service "nginx" do supports :status => true, :restart => true, :reload => true action [ :enable, :start] end template "nginx.conf" do path "/etc/nginx/nginx.conf" source "nginx.conf.erb" owner "root" group "root" mode 0644 notifies :reload,'service[nginx]' end
nodes以下のファイルの設定を行います。nginxレシピに対する変数と、実行するレシピの指定をしています。
nodes/aws-knife.json
{
"nginx": {
"port" : 80
},
"run_list": [
"nginx"
]
} コンフィグファイルの設定を行います。基本的には、nginx.confをそのまま持っていくだけで大丈夫です。サーバごとに任意に変えたいところを変数化します。今回の例では、<%=node['nginx']['port']%>の部分です。
templates/default/nginx.conf.erb
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen <%=node['nginx']['port']%>;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
knife soloによりサーバ構築の実行
いよいよレシピを元にサーバを構築します。実行は下記のコマンドだけです。
knife solo cook aws-knife
|
エラーが出なければ、ブラウザからサーバのURLを叩いてみましょう。

なんという事でしょう。サーバに一度もログインせずに、nginxのインストールから起動まで行えました。
まとめ
とっつきにくいようですが、Chef Soloは相当出来る子です。またKnife Soloはとっても便利です。そして、何か困った時は、入門Chef Soloをご参考に!!
See Also:
手動でサーバの設定をすることを禁ずる。入門Chef Solo
何故、fluentdなのか?