Posted on May 5
Chef
を操作する各種コマンドについてうろ覚えだったりして毎回ググるのが面倒なので纏めてみる。
Chef
そのものや必須(だと思う)ツール各種の導入について。
一番簡単なのは Omunibus
インストーラーを利用する。
curl -L https://www.opscode.com/chef/install.sh | bash
というか、この方法以外ではやった記憶が無いけど、出来るとすれば、各ディストリビューションのパッケージインストールコマンドでインストールが出来そう。
ちなみに、この方法でインストールすると組み込みの Ruby
が以下のパスにインストールされる。
/opt/chef/embedded/bin/
簡単。
gem install knife-solo --no-ri --no-rdoc -V
簡単。
gem install berkshelf --no-ri --no-rdoc -V
だけど EC2 インスタンスの t1.micro
だとコンパイル途中で止まることがあるので、インストールの際は環境のリソースについて注意すること。
chef-solo
を実行して Cookbook
を適用する為に必要な最低限の設定ファイル各種。
cookbooks
や site-cookbooks
のパス等の各種パス、ログの出力レベルを設定する。
file_cache_path "/path/to/chef-solo"
cookbook_path ["/path/to/cookbooks", "/path/to/site-cookbooks"]
role_path "/path/to/roles"
log_level :info
詳細については下記を見ること。
上記の例はホントに最低限。
JSON
形式で書く。配列の最後はカンマ(ケツカンマと言うらしい)不要なので注意。
{
"run_list": [
"recipe[apache2]",
"recipe[mysql]"
]
}
nodes/${HOSTNAME}.json
というファイル名で保存することが多い。
尚、run_list
以下が参考になる。
以下のように実行する。
chef-solo -c solo.rb -j nodes/localhost.json
尚、chef-solo
については下記を読む。
Berkshelf
の使い方。Berkshelf
は cookbook
の gem
みたいなもの。
以下のように書く。
source "https://api.berkshelf.com"
cookbook "mysql"
cookbook "nginx", "~> 2.6"
詳細は下記を読むこと。
尚、Berksfile
内に metadata
の記述がある場合にはカレントディレクトリに metadata.rb
ファイルを探しに行こうとするので注意する。(もちろん、metadata.rb
が存在しない場合には berks vendor
コマンドは失敗する)
Cookbook
を作成する。
berks cookbook ${COOKBOOK_NAME} ${COOKBOOK_PATH}
上記を実行すると ${COOKBOOK_PATH}
に Cookbook
が作成される。
Berksfile
に書いた Cookbook
をインストールする。
berks vendor ${COOKBOOK_PATH}
上記を実行すると ${COOKBOOK_PATH}
に Berksfile
に記載された Cookbook
がインストールされる。
他の Cookbook
から利用する場合には二つのステップが必要。
include_recipe '${COOKBOOK_NAME}'
を追加run_list
に include_recipe
した Cookbook
を追加する以下のような感じ。
include_recipe "docker"
#
docker_image 'centos'
#
docker_container 'centos' do
command 'echo "a"'
detach true
end
前回の記事で利用したレシピ。以下は run_list
。
{
"run_list": [
"recipe[docker]",
"recipe[docker-test]"
]
}
その他 Chef
を利用する上で覚えておくと良いこと等。
chef-solo
よりも限定的。引数にレシピファイルを指定することでレシピに書かれている内容を実行する。
chef-apply default.rb
また、レシピに書かれている内容(DSL
)を引数として渡すことでその内容を実行してくれる。
chef-apply -W -e 'package "httpd" do action :install end'
上記のように -e
オプションに続いてレシピの DSL
を記載する。-W
は --why-run
オプション。実行すると以下のように結果が表示される。
おお。
尚、以下がとても参考になった。
用途としては、ちょっとしたレシピに使えそう。上記の参考サイトでは ohai
を実行したり直接 Ruby
のコードを実行させたりしていて地味に便利そう。
Cookbook
を適用する前、適用した後に何らかの処理を加えることが出来るのが Handlers
。詳細については以下がとても詳しい。
@sawanoboly さんににマジ感謝。
Handlers
には以下の三種類が存在する。
exception
(例外が発生した際になんかやる)report
(Cookbook
が適用が正常に終了した際になんかやる)start
(chef-client
が走る前になんかやる)各々はレシピから呼び出すか client.rb
又は solo.rb
に記述して利用することが出来る。例えば、solo.rb
に以下の記述しておいて…
require 'chef/handler/json_file'
report_handlers << Chef::Handler::JsonFile.new(:path => "/var/chef/reports")
exception_handlers << Chef::Handler::JsonFile.new(:path => "/var/chef/reports")
chef-solo
を実行すると…
chef-solo -c solo.rb -j nodes/localhost.json
/var/chef/reports/
以下に chef-run-report-YYYYMMDDhhmmss.json
という JSON
ファイルが出力されている。
上記は出力例のほんの一部。数行のレシピなのに大量の JSON
ファイルが出力される。
尚、以下のようなサードパーティ製の Handler
も存在する。
ほうほう。上記以外にもいくつか存在する。Graphite
あたりをちょっと試してみたい。
前述の chef-apply
+ Ohai
でノードの情報を簡単に取り出すには以下のように実行する。
chef-apply -e "puts node[:hostname]"
プラットフォームや OS
の条件分岐でちょいと確認したい時に便利。以下は属性の一部。
node['platform']
はプラットフォームを出力するnode['platform_version']
はプラットフォームのバージョンを出力するその他の属性情報については以下を参照。
Handlers
は面白そうなので Graphite
と絡めて試してみたい2014 かっぱのほげふが