chef

Chefの基本

More than 5 years have passed since last update.


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ディレクトリ直下に配置する。


localhost.json

{

"run_list":[
"recipe[hello]"
]
}

Chefが利用するテンポラリディレクトリやクックブックのパスを指定する設定ファイルも必要。同じくchef-repoディレクトリ直下に配置する。


solo.rb

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コマンドで実行する


レシピサンプル


特定パッケージのインストール


default.rb

package "zsh" do

action :install
end


複数パッケージをまとめてインストール


default.rb

%w{zsh gcc make readline-devel}.each do |pkg|

package pkg do
actoin :install
end
end


iptablesをオフに


default.rb

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