##Chefとは
サーバ設定や更新を自動化するツール。
レポジトリ>クックブック>レシピ
という階層で管理する。
一つのシステムにつきレポジトリ一つ、という粒度。
利用形態には以下の二つがある。
####Chef-Server + Chef-Client
→Chef ClientがChef Serverからhttpで必要な情報をGETし、実行する。ChefServerの管理はちょっと大変。
####Chef-Solo
→サーバ管理を必要としないスタンドアロン版。
##Chefのインストール
$ curl -L http://www.opscode.com/chef/install.sh | sudo bash
もしくは
$ gem install chef
レポジトリ作成
OpsCodeがgithubに公開しているレポジトリのひな形
(後述のknife-soloを使えばそちらで肩代わりできる。)
$ git clone git://github.com/opscode/chef-repo.git
クックブック作成
knifeを用いる
##knifeとは
chefレポジトリを操作するためのツール。
クックブックの作成はこれで行う。
chef solo環境で利用するのは主に以下の二つ
・knife cookbook(クックブックの作成)
・knife solo
##knifeの初期設定
$ knife configure
諸々の質問事項は全てデフォルトでok。
初期化が完了すると
~/.chef/knife.rbに設定ファイルが保存される。
##クックブックの作成
$ cd chef-repo
$ knife cookbook reate hello -o cookbooks
cookbooksディレクトリ内にhelloというクックブックを作成。
##レシピの作成
クックブック作成時点でレシピのひな形は作成済となる。
$ vi cookbooks/hello/recipes/default.rb
"Hello, Chef!"を出力するだけのレシピ。
log "Hello, Chef!"
##Chef Soloの実行
Chef Solo実行時に実行するレシピを記述するJSONファイルを用意する。
chef-repoディレクトリ直下に配置する。
{
"run_list":[
"recipe[hello]"
]
}
Chefが利用するテンポラリディレクトリやクックブックのパスを指定する設定ファイルも必要。同じくchef-repoディレクトリ直下に配置する。
file_cache_path "/tmp/chef-solo"
cookbook_path ["/home/ec2-user/chef-repo/cookbooks"]
##実行
$ sudo chef-solo -c solo.rb -j ./localhost.json
##chef-soloの流れまとめ
・レシピを作る
・JSONファイル内で、実行レシピを指定する
・chef-soloコマンドで実行する
##レシピサンプル
###特定パッケージのインストール
package "zsh" do
action :install
end
###複数パッケージをまとめてインストール
%w{zsh gcc make readline-devel}.each do |pkg|
package pkg do
actoin :install
end
end
##iptablesをオフに
service 'iptables' do
action [:disable, :stop]
end
※chefは何度実行しても、エラー等は発生しない。
→冪等性(何度操作を行っても、結果が同じであること)がある。
##Resourceとは
Chefが提供するDSL(Ruby組み込みの文法ではない)。
レシピ内で用いる、「サーバの状態に何らかの影響を与える命令」のこと。
log、packageなど
##ノード(node)とは
管理対象の各サーバのこと。
※その文脈で言うと、JSONファイルに書くのは特定のノードの「状態」となる。
JSONファイル内のデータ構造をNode Objectと呼び、そのプロパティとして、以下の2つを列挙する。
・そのノードに適用するべきレシピ
・そのノードが持っている変数(Attribute)
Chef Serverを用いる場合にはChef Serverに格納しておくが、
Chef Soloの場合はその格納場所がないので、ローカルにJSONファイルとして書いておく。
knife-soloを用いた実用例はこちら
knife-soloによるChefの実行
http://qiita.com/kidachi_/items/b222fb2892e6108c46d5