Bibliotecário-chef で Livro de receitas を 管理 し て サ ー バ の セ ッ ト ア ッ プ

Bibliotecário-chefを 使 い 、 bundler の よ う に 必要 な livro de receitas を 管理 す る。

Chef の セ ッ ト ア ッ プ

毎 度 つ か う う も の な の で 、git clone一 発 で chef-cliente 系 を セ ッ ト ア ッ プ 出来 る よ う に し た。

Ubuntu: https://github.com/higanworks/chef-with-ruby_precise-x86_64
CentOS: https://github.com/higanworks/chef-with-ruby_CentOS-x86_64

セ ッ ト ア ッ プ は LEIA-ME に あ る よ う に コ マ ン ド 2 つ


$ apt-get install git
$ git clone https://github.com/higanworks/chef-with-ruby_`lsb_release -cs-uname -i`.git /opt/ruby-chef
</code></pre>

以降はとりあえずUbuntuで上記を使った場合のchef-solo発動までを紹介。

Cheffile作業ディレクトリへ

リポジトリをクローンしたら /opt/ruby-chef で作業する。

cd /opt/ruby-chef

サンプルではcookbooksもこの下に置かれるようにしている。

librarian-chefは必要なCookbookの名前と所在、依存をCheffileに書き、installサブコマンドでCookbooksディレクトリを形成する。
集めた結果をCheffile.lockに書く、lockを元に作るdeploymentモードこそ無さそうだがとてもbundlerのようだ。

Cheffile.sample をそのまま使う場合はCheffileとしてコピー。
cp Cheffile.sample Cheffile

空のCheffileを作る場合は
./bin/librarian-chef init

Cheffileからcookbooksの準備

chefファイルにcookbookの名前と所在を書く、とりあえずsoloなのでこのサーバに必要なものだけ記述。

nginxとredisとmonitを導入したい、ついでにruby(rvm)。

Cheffile(sample)


!/usr/bin/env ruby

^syntax detection

site 'http://community.opscode.com/api/v1'

cookbook 'apt'

external

cookbook 'rvm',
:git => 'https://github.com/fnichol/chef-rvm'

my cookbooks

cookbook 'nginxppa',
:git => 'https://github.com/higanworks-cookbooks/nginxppa.git'

cookbook 'monitbinaries',
:git => 'https://github.com/higanworks-cookbooks/monitbinaries.git'

cookbook 'redissrc',
:git => 'https://github.com/higanworks-cookbooks/redissrc.git'
</code></pre>

Cookbookインストール

./bin/librarian-chef install と叩き、./cookbooksの下にCookbookを集めてくる。



./bin/librarian-chef install

./bin/librarian-chef show

apt (1.4.8)
monitbinaries (0.0.3)
nginxppa (0.0.1)
redis_src (0.0.1)
rvm (0.9.1)
</code></pre>

もちろんこれをknife cookbook uploadするような運用もあり。

レシピの適用

単一のレシピ適用

solo用のサンプルコンフィグがついているので叩く。
適用したいレシピは-oで指定できる。



./bin/chef-solo -c solo.rb -o nginx_ppa::default

-- snip --
[2012-09-19T20:29:28-07:00] INFO: Processing package[nginx] action install (nginx_ppa::default line 34)
-- snip --

nginx -v

nginx version: nginx/1.2.3
</code></pre>

Jsonの構成ファイルを用いた複数のレシピ適用

-oの直接指定ではなく、chef-soloに-jでjsonによる構成ファイルを渡す。
色々入れて、rvmでruby1.9.3を使えるようにしておいてねというコース。

sample.json

{
"rvm" : {
"defaultruby" : "system",
"rubies" : [
"ruby-1.9.3-p194"
]
},
"runlist" : [
"recipe[apt]",
"recipe[nginxppa]",
"recipe[monitbinaries]",
"recipe[redis_src]",
"recipe[rvm::system]"
]
}
</code></pre>

Roleも書ける。



./bin/chef-solo -c solo.rb -j ./sample.json

[2012-09-19T20:28:35-07:00] INFO: *** Chef 10.14.2 ***
[2012-09-19T20:28:35-07:00] INFO: Setting the runlist to ["recipe[apt]", "recipe[nginxppa]", "recipe[monitbinaries]", "recipe[redissrc]", "recipe[rvm::system]"] from JSON
[2012-09-19T20:28:35-07:00] INFO: Run List is [recipe[apt], recipe[nginxppa], recipe[monitbinaries], recipe[redis_src], recipe[rvm::system]]

-- snip --

redis-server -v

Redis server version 2.4.16 (04a08723:1)

monit -V

This is Monit version 5.5
Copyright (C) 2001-2012 Tildeslash Ltd. All Rights Reserved.

nginx -v

nginx version: nginx/1.2.3
</code></pre>

あとは設定ファイルをテンプレートにレシピを書いて、構成をバージョン管理していく。