chef-solo
入門の入門
2013-12-09 (月) @アクトインディ株式会社
安宅 正之
目次
1.
2.
3.
4.

入門書紹介
chef-solo first step
用語解説
chef-solo の始め方

5. レシピの書き方
とりあえず入門書
伊藤直也さんの書いた「入門 Chef Solo」
2013/3/11 発売
変更点 -- 出版時との違い
意外とハマる
● chef-solo 11.4.0 → 11.8.0
● ruby 1.9 → 2.0 (released 2013/02/24)
● gem install vagrant → package 化 (1.1+)
● vagrant gem install sahara
→ vagrant plugin install sahara
ruby 2.0 で gem install chef-solo がエラーになっ
てインストール出来ない時期があったので混乱し
ました
chef-solo first step
chef-solo インストール
$ cat Gemfile
source 'https://rubygems.org'
gem 'chef'
$ bundle install --path vendor/bundle
chef-solo 実行
実行は sudo 権限で行う

$ sudo bundle exec chef-solo -j node.json

That’s all...
用語解説
専門用語多すぎ。訳が分からないよ!
●
●
●
●
●
●

chef, chef-solo, Chef Server
knife, knife-solo
node, role
repository, cookbook, recipe
attribute, data bug
Berkshelf
専門用語多すぎ。訳が分からないよ!
●
●
●
●
●
●

chef, chef-solo, Chef Server
knife, knife-solo
node, role
repository, cookbook, recipe
attribute, data bug
Berkshelf

chef-solo だけなら青字を理解すれば OK
Chef World

[サーバー]
node
role

[コマンド]
chef-solo
knife

[設定ファイル]
node.json
cookbook
recipe
サーバーの用語
● node: server (or PC/仮想環境) に対応
○
○
○
○
○

albeniz server
bach server
chopin server
dvorak server
…

● role: server の役割に対応
○
○
○
○
○

web server
git server
Redmine server
本番サーバー、ステージング・サーバー
...
設定ファイルの用語
● server.json: サーバーごとの設定ファイル
○ 今回は node.json という名前を使います
○ recipe を指定する

● recipe: メイン・スクリプト in cookbook
● cookbook: chef における最小単位
○ recipe や template を収納

● cookbooks: cookbook を入れるディレクトリ
○ cookbooks: 既存の cookbook を入れる
○ site-cookbooks: 自作の cookbook を入れる
○ という区切りの筈だけど、デフォルトは
/var/chef/cookbooks/ になっている
cookbook の中身
●
●
●
●
●
●
●
●
●
●
●

CHANGELOG.md
README.md
attributes/
definitions/
files/
libraries/
metadata.rb
providers/
recipes/
resources/
templates/
cookbook の中身
●
●
●
●

attributes: 変数
files: 変数を使わないファイル
recipes/default.rb: メインの処理を書く
templates: attribute を使えるファイル
○ templates/default/filename.erb
コマンドの用語
● knife: cookbook の作成
● chef-solo: node.json or recipe の実行
chef-solo の始め方
chef-solo 初期設定
$ sudo apt-get install ruby-dev
# For gem json
$ mkdir /etc/chef
# Permission は適当につけてね
$ mkdir /var/chef
$ cd /etc/chef
$ cat Gemfile
source ’https://rubygems.org’
gem ’chef’
$ bundle install --path vendor/bundle # chef インストール
$ bundle exec knife configure
$ touch solo.rb
cookbook を実行してみよう
$ bundle exec knife cookbook create hello
# cookbook 作成
$ vi /var/chef/cookbooks/hello/recipes/default.rb
# recipe の編集
$ cat /var/chef/cookbooks/hello/recipes/default.rb
log ’Hello, Chef!’
$ sudo bundle exec chef-solo -o hello
…
# recipe を指定
Recipe: hello::default
* log[Hello, Chef!] action write
node.json を使ってみる
$ cat node.json
{
”run_list” : [
”recipe[hello]”
]
}
$ sudo bundle exec chef-solo -j node.json
# 複数の recipe を扱うにはこっちの方が便利
レシピの書き方
Package
プラットフォームに合わせてパッケージシステムを
選択・実行
● Redhat … yum
● Debian … apt
package ”zsh” do
action :install
end
Git
Git repository から取得
● :checkout … 取得
● :sync … 更新

git ”/usr/local/src/fcopy” do
repository ”git://github.com/ataka/fcopy.git”
reference ”master”
action :checkout
user ”ataka”
end
Bash -- Shell Script の実行
● creates … スクリプト再実行をガードするファイ
ルを指定する
● not_if, only_if … より詳細な設定向け
bash ”install tc” do
user ’ataka’
cwd ’/usr/local/src/tc’
code <<-EOC
./configure && make && make install
EOC
creates ”/usr/local/share/emacs/site-lisp/tc”
end
Directory
ディレクトリ操作
chef はディレクトリを自動作成してくれない
● :create … 作成
● :delete … 削除
directory ’/usr/local/src’ do
owner ’ataka’
group ’staff’
mode ’0775’
action :create
end
Template
設定ファイルなどはコレ使え!
filename.erb を templates/default 以下に置く
template ”/etc/nginx/nginx.conf” do
source ”nginx.conf.erb” # 省略可
owner ”root”
group ”root”
mode 0644
end
終わりに
● attribute については機会があったら
● Opscode の chef は使ったことがないので分か
りません
● knife-solo はまだ使ったことないので分かりま
せん
● vagrant で sahara を使うと幸せになれる
● rbenv 使ったら sudo でハマった
○ システムインストール
○ PATH 環境変数の引き渡し
○ いろいろやり方はあるけど、ベストプラクティスではない
気がする

Chef solo 入門の入門