このエントリーをはてなブックマークに追加

4.1.7. chef-solo

4.1.7.1. 概要

Chefは、Puppet同様にRubyで作成されている構成管理ツールです。パッケージのインストール、設定、サービスの状態などを自動化出来ます。
利用することにより設定間違い、環境ごとの設定差分、時間の効率化を図ることが出来ます。
その中でもchef-soloはserverを用意せずにそのまま実行可能なパッケージです。
詳しくは、 本家のリンク を参照してください。

4.1.7.2. ツール類

ツール名 概要
chef-server 情報を集約して管理するサーバプロセス。各 Client とは JSON/REST スタイルで通信する。
chef-client 設定を適用する各マシンにインストールされるデーモン。定期的に chef-server をポーリングして、その内容に従ってレシピを実行する。
chef-solo サーバ無しでレシピを実行するツール。
knife chef-server に登録されている情報の取得・変更を行うツール。
webui chef-server の Web インターフェース。

4.1.8. 構成

4.1.8.1. インストール

新しいインストーラが出来ていたみたいでche-soloとknife使うだけなら凄い簡単に出来るようになってます。
インストーラはOSがCentOS6.3の場合ですので他OSの場合はhttp://www.opscode.com/chef/install/でコマンドを確認してください。
gitはChefを利用するための雛形をダウンロードするのに利用しますのでインストールします。
$ su -
# curl -L http://www.opscode.com/chef/install.sh | bash
# yum install git -y

以上でインストールは終了です。

4.1.8.2. Chef-Soloの利用

4.1.8.2.1. 雛形をダウンロード

# git clone git://github.com/opscode/chef-repo.git

4.1.8.2.2. 設定ファイルを作成

# cd chef-repo
# mkdir .chef

# vi .chef/solo.rb
file_cache_path "/tmp/chef-solo"
cookbook_path "/root/chef-repo/cookbooks"
#json_attribs    "/root/chef-repo/.chef/chef.json"
#role_path       "/tmp/chef-repo//roles"
#recipe_url      "http://www.example.com/chef-solo.tar.gz"
#log_level :debug

# vi .chef/chef.json
{
  "run_list": [
     "recipe[install_packages]"
  ]
}

4.1.8.2.3. レシピの作成

wgetとtelnetとftpとmanをインストールするレシピを作成します。

# knife cookbook create install_packages -o cookbooks
# vi cookbooks/install_packages/recipes/default.rb
%w(wget telnet ftp man).each do |name|
  package name do
    action :install
  end
end

4.1.8.2.4. レシピの実行

# chef-solo -c .chef/solo.rb -j .chef/chef.json
[2012-09-25T17:07:17+09:00] INFO: *** Chef 10.14.2 ***
[2012-09-25T17:07:18+09:00] INFO: Setting the run_list to ["recipe[install_packages]"] from JSON
[2012-09-25T17:07:18+09:00] INFO: Run List is [recipe[install_packages]]
[2012-09-25T17:07:18+09:00] INFO: Run List expands to [install_packages]
[2012-09-25T17:07:18+09:00] INFO: Starting Chef Run for stack01
[2012-09-25T17:07:18+09:00] INFO: Running start handlers
[2012-09-25T17:07:18+09:00] INFO: Start handlers complete.
[2012-09-25T17:07:18+09:00] INFO: Processing package[wget] action install (install_packages::default line 10)
[2012-09-25T17:07:20+09:00] INFO: package[wget] installing wget-1.12-1.4.el6 from base repository
[2012-09-25T17:07:22+09:00] INFO: Processing package[telnet] action install (install_packages::default line 10)
[2012-09-25T17:07:22+09:00] INFO: package[telnet] installing telnet-0.17-47.el6 from base repository
[2012-09-25T17:07:24+09:00] INFO: Processing package[ftp] action install (install_packages::default line 10)
[2012-09-25T17:07:24+09:00] INFO: package[ftp] installing ftp-0.17-51.1.el6 from base repository
[2012-09-25T17:07:26+09:00] INFO: Processing package[man] action install (install_packages::default line 10)
[2012-09-25T17:07:26+09:00] INFO: package[man] installing man-1.6f-30.el6 from base repository
[2012-09-25T17:07:30+09:00] INFO: Chef Run complete in 12.036638696 seconds
[2012-09-25T17:07:30+09:00] INFO: Running report handlers
[2012-09-25T17:07:30+09:00] INFO: Report handlers complete
以上です。
簡単に使うところまで持って行けます。
また W オプションでドライランも利用できます。
実際には実行されないオプションなので動作確認には非常に有効です。
# chef-solo -c .chef/solo.rb -j .chef/chef.json
[2012-09-25T17:15:13+09:00] WARN: Forcing formatter of 'doc' to capture whyrun output.
Starting Chef Client, version 10.14.2
[2012-09-25T17:15:13+09:00] INFO: *** Chef 10.14.2 ***
[2012-09-25T17:15:13+09:00] INFO: Setting the run_list to ["recipe[install_packages]"] from JSON
[2012-09-25T17:15:13+09:00] INFO: Run List is [recipe[install_packages]]
[2012-09-25T17:15:13+09:00] INFO: Run List expands to [install_packages]
[2012-09-25T17:15:13+09:00] INFO: Starting Chef Run for stack01
[2012-09-25T17:15:13+09:00] INFO: Running start handlers
[2012-09-25T17:15:13+09:00] INFO: Start handlers complete.
Compiling Cookbooks...
Converging 4 resources
Recipe: install_packages::default
  * package[wget] action install[2012-09-25T17:15:13+09:00] INFO: Processing package[wget] action install (install_packages::default line 10)
 (up to date)
  * package[telnet] action install[2012-09-25T17:15:15+09:00] INFO: Processing package[telnet] action install (install_packages::default line 10)
 (up to date)
  * package[ftp] action install[2012-09-25T17:15:15+09:00] INFO: Processing package[ftp] action install (install_packages::default line 10)
 (up to date)
  * package[man] action install[2012-09-25T17:15:15+09:00] INFO: Processing package[man] action install (install_packages::default line 10)
 (up to date)
[2012-09-25T17:15:15+09:00] INFO: Chef Run complete in 1.19764547 seconds
[2012-09-25T17:15:15+09:00] INFO: Running report handlers
[2012-09-25T17:15:15+09:00] INFO: Report handlers complete
Chef Client finished, 0 resources updated

4.1.8.3. Ohaiの利用

Puppetではfacterを利用したりしますが、ChefではOhaiというシステム情報を取得するコマンドがありますので利用できます。
Json形式で出力されます。
rubyのパスはインストーラによってインストールされたものを利用していますので実際には違うかもしれません。
# ohai

情報量が多すぎてあれなのでスクリプトを作成して必要な情報を取得してみます。

# vi ohai.rb
#!/opt/chef/embedded/bin/ruby
require 'rubygems'
require 'ohai'

ohai = Ohai::System.new
ohai.all_plugins

#eth0の情報を表示
puts ohai[:network][:interfaces][:eth0][:addresses]

puts "######################################################"

#ファイルシステムの情報を表示
puts ohai[:filesystem]['/dev/vda1']

puts "######################################################"

#カーネルの情報を表示
puts ohai[:kernel][:name]

# ruby ohai.rb
{"52:54:00:52:AD:BB"=>{"family"=>"lladdr"}, "192.168.10.60"=>{"family"=>"inet", "prefixlen"=>"24", "netmask"=>"255.255.255.0", "broadcast"=>"192.168.10.255", "scope"=>"Global"}, "2001:c90:8223:951:5054:ff:fe52:adbb"=>{"family"=>"inet6", "prefixlen"=>"64", "scope"=>"Global"}, "fe80::5054:ff:fe52:adbb"=>{"family"=>"inet6", "prefixlen"=>"64", "scope"=>"Link"}}
######################################################
{"kb_size"=>"495844", "kb_used"=>"31943", "kb_available"=>"438301", "percent_used"=>"7%", "mount"=>"/boot", "fs_type"=>"ext4", "mount_options"=>["rw"], "uuid"=>"ceb78d88-316e-4c4d-8aa3-03c2f7665c13"}
######################################################
Linux

4.1.8.4. OpscodeのCookbooksを利用する

GitHubに Opscode Cookbooks`< Opscode Public Cookbooks https://github.com/opscode-cookbooks>`_ にCookbooksがいくつも用意されているので自分で作成するのに参考になると共にそのまま利用することも出来ます。
コミュニティのほうのTmuxをインストールするスクリプトのチェックサムのattributeがtmxuになってますね。
まあ問題無いです。
OpenStackのKeystoneとかもあるけど中身何も書かれてないみたいです。
あと用途別に区分けしているとこもよさそうです。 <Cookbooks All Categories http://community.opscode.com/cookbooks>_

4.1.8.4.1. tmuxを利用

コミュニティ版のほうだとRedHat系のほうはリポジトリに含まれていないのでソースからインストールしてくれます。
gccなどは用意してくれないみたいなのでそれは別途用意します。
# git clone git://github.com/opscode-cookbooks/tmux.git /root/chef-repo/cookbooks/tmux
# vi .chef/chef.json
{
  "run_list": [
     "recipe[tmux]"
  ]
}

# yum groupinstall "Development Tools" -y
# chef-solo -c .chef/solo.rb -j .chef/chef.json