- インフラ・ミドルウェア・アプリケーション構成の設定・管理フレームワーク
- CUIコマンドベースでなく、Rubyベースで記述する
- 一度書けば、誰でも実行できたり、再利用できるのが嬉しい
- 類似フレームワークとしては、Puppetが有名
- 開発環境や本番環境の構築高速化・標準化ができる
- ネットワークやユーザの設定、ミドルウェアのインストール、etc
- VirtualBoxなら最終的には、Box作成から起動・環境構築まで、数コマンドで実行できる
- EC2も似たような感じにできる(っぽい)
- Node:構築する対象環境
- Cookbook: ある構築設定の塊
- Recipe: Cookbookの中にある実行手順
- Attribute: Cookbookの中にあるパラメータ(色々なタイミングで変更可能)
- Resource: 環境と対話するための抽象化されたAPI
- ResourceのAPIをRecipeにペタペタ書いて、細かい部分はAttributeで調整 が基本
- Client / Server 型
- ServerでCookbookや各NodeのAttributeを管理して実行
- Solo型
- CookbookやAttributeを別途指定する形で実行
- Local FileにCheckOutしておいたり
- CookbookやAttributeを別途指定する形で実行
sudo rpm -Uvh http://rbel.frameos.org/rbel6
sudo yum install -y git openssl ruby rubygems ruby-devel ruby-ri ruby-rdoc \
ruby-shadow gcc gcc-c++ automake autoconf make curl dmidecode
sudo gem install chef --no-ri --no-rdoc
sudo apt-get update
sudo apt-get install -y ruby ruby-dev libopenssl-ruby rdoc ri irb \
build-essential wget ssl-cert curl rubygems git openssl
sudo gem install chef --no-ri --no-rdoc
git clone git://github.com/opscode/chef-repo.git chef-solo
cd chef-solo
curl -O https://raw.github.com/gist/4030555/config_solo.sh
sh config_solo.sh
-
Opscodeで公開されているcookbookがある
-
例えばntpを取り込む
knife cookbook site install ntp -c knife.rb
-
ntpを実行してみる
sudo chef-solo -c solo.rb -o ntp
これでntpやntpdが起動されるが、これだとyumとかと大して変わらない。
-
/etc/ntp.conf を変更したい
cat<<EOF>node.json { "ntp": { "servers": ["ntp.nict.jp"] } } EOF sudo chef-solo -c solo.rb -o ntp -j node.json
このnode.jsonでntpのAttributeを上書きしてみると、/etc/ntp.confが書き換わっている。
どういうAttributeが使われそうかは、cookbooks/ntp/attributes/default.rb などを見るとわかる。大抵は、 cookbooks/ntp/README.md などにどういう使い方をするか書いてある。
紳士協定で、["cookbook名"]["Attribute名"]
という名前空間を大抵は使う。
この、cookbooks と node.json を Commitしておけば、他の環境でも
sudo chef-solo -c solo.rb -o ntp -j node.json
で実行できるようになるというわけである。
###Recipeのポイント
標準的なResource APIや、各Cookbookが提供するAPIを上手く利用するのがコツ。
他人が作ったCookbookを読むことも多いと思うので、Cookbookの構成について簡単に説明する。
-
基本Cookbookは cookbooksディレクトリ以下にある
- REPO/cookbooks/{many_cookbooks...}
-
例えば、yum の cookbook には以下のDIRがある
- recipes/
- attributes/
- templates/
- providers/
- resources/
- Recipeは、実際に実行するコマンドの単位。
- recipes/default.rb というのがデフォルトで実行されるファイルになる。
- 例えば、 ntp というRecipeを実行すると、 cookbooks/ntp/recipes/default.rb が実行される
- ntp::hoge というRecipeを実行すると cookbooks/ntp/recipes/hoge.rb が実行される
-
Attibuteは、外部から実行時に指定可能な値のセットになる。
-
attributes/default.rb というのがCookbookが標準で準備している値になる。例えばこんな感じ。
default["apache"]["dir"] = "/etc/apache2" default["apache"]["listen_ports"] = [ "80","443" ]
もしくは
default.apache.dir = "/etc/apache2" default.apache.listen_ports = [ "80","443" ]
と書ける。
-
rails/attributes/tunables.rb などは、 include_attribute "rails::tunables" などで読み込める
-
Attributeは node.apache.dir などという形でRecipeでは参照される。先ほどのAttributeは以下のようにも書ける。
node.default["apache"]["dir"] = "/etc/apache2" node.default["apache"]["listen_ports"] = [ "80","443" ]
-
上書きのルールなどは結構複雑?なので、http://wiki.opscode.com/display/chef/Attributes を参考に。
-
Templateは、設定ファイルなどを記述するときによく使う。
-
erb(Embedded Ruby)のフォーマットで書く。 例えば、以下のようなTemplateがあったとする。
# # /etc/sudoers # # Generated by Chef for <%= node[:fqdn] %> # Defaults !lecture,tty_tickets,!fqdn # User privilege specification root ALL=(ALL) ALL <% @sudoers_users.each do |user| -%> <%= user %> ALL=(ALL) <%= "NOPASSWD:" if @passwordless %>ALL <% end -%> # Members of the sysadmin group may gain root privileges %sysadmin ALL=(ALL) <%= "NOPASSWD:" if @passwordless %>ALL <% @sudoers_groups.each do |group| -%> # Members of the group '<%= group %>' may gain root privileges %<%= group %> ALL=(ALL) <%= "NOPASSWD:" if @passwordless %>ALL <% end -%>
Recipeからこんな感じで呼び出せる。
template "/etc/sudoers" do source "sudoers.erb" mode 0440 owner "root" group "root" variables({ :sudoers_groups => node[:authorization][:sudo][:groups], :sudoers_users => node[:authorization][:sudo][:users] }) end
- ResourceとProviderは、他のRecipeに提供するAPIのようなものである。
- 例えば yum/{resources,providers}/repository.rb というファイルは、 yum_repository という Resource APIになる。
- resourcesが宣言で、providersが実装みたいな位置づけ(たぶん)。
(ほぼ、Software Design 2012/10 より)
Command | 意味 |
---|---|
template | erb 形式でテキストファイルを設置する |
cookbook_file | 任意のファイルを配置するときに使う |
file | 圧縮ファイルなど、主にバイナルファイルの配布に利用される |
directory | ディレクトリを設定する |
user | ユーザを設定する |
group | グループを設定する |
package | パッケージのインストール、アップデートなど |
service | サービスの起動・管理 |
ifconfig | インターフェースの設定 |
cron | cron の設定 |
script | 指定したスクリプト言語(bash, perlなど) でコマンドを実行する |
deploy | ソースコード管理システムからのデプロイを行う |
log | Chefの実行時にログを出力する |
標準APIリスト。例とかもあります。 http://wiki.opscode.com/display/chef/Resources
簡単ですが、こんなシナリオで。
- VagrantでVirtualBox作成&起動
- zsh, screen の Install
- User作成 && Shell は zsh
- 10gen の yum repository を追加して、 mongodb2.2 を Install
[[Chef実演メモ]]
- Vagrant
- VirtualBoxをコマンドラインから制御するツール。gemで入る。
- CookbookをVirtualBoxで検証したいときに便利
vagrant my_chef_test up
とかで起動&Chef実行ができたりする。 - OSImageList: http://www.vagrantbox.es/