fbpx

Chefを使ってみよう [3]

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

Chef Soloを使ってみよう

Chef SoloとはChef ServerなしでCookbookを利用するためのツールです。インストールや管理に手間のかかるChef Serverを準備する必要がなく、単一のホストでChefを利用することが可能になります。その反面、Chef Soloを実行するホスト上にChefを利用するための情報を揃えておく必要があります。

chef-soloホストの準備

Chef Soloを実行するホストをchef-soloホストとします。これまで同様、chef-soloホストは新規にUbuntu Server 11.10をインストールし、Opscode社のaptレポジトリの設定までを行います。

chef-soloコマンドはchefパッケージに入っているのでインストールします。

root@chef-solo:~# aptitude install chef
The following NEW packages will be installed:
  chef libabstract-ruby1.8{a} libbunny-ruby{a} libbunny-ruby1.8{a}
  liberubis-ruby{a} liberubis-ruby1.8{a} libhighline-ruby{a}
  libjson-ruby{a} libmixlib-authentication-ruby{a}
  libmixlib-authentication-ruby1.8{a} libmixlib-cli-ruby{a}
  libmixlib-cli-ruby1.8{a} libmixlib-config-ruby{a}
  libmixlib-config-ruby1.8{a} libmixlib-log-ruby{a}
  libmixlib-log-ruby1.8{a} libmoneta-ruby{a} libmoneta-ruby1.8{a}
  libnet-ssh-multi-ruby{a} libnet-ssh2-ruby{a} libohai-ruby{a}
  libohai-ruby1.8{a} libpolyglot-ruby{a} libreadline5{a}
  librestclient-ruby{a} libruby1.8{a} libsystemu-ruby1.8{a}
  libtreetop-ruby{a} libuuidtools-ruby{a} libuuidtools-ruby1.8{a}
  libyajl-ruby{a} ohai{a} ruby-highline{a} ruby-ipaddress{a} ruby-json{a}
  ruby-mime-types{a} ruby-net-ssh{a} ruby-net-ssh-gateway{a}
  ruby-net-ssh-multi{a} ruby-rest-client{a} ruby1.8{a} ruby1.8-dev{a}
  rubygems{a}
0 packages upgraded, 43 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/3,932 kB of archives. After unpacking 22.3 MB will be used.
Do you want to continue? [Y/n/?] y
	:
	:
	:
root@chef-solo:~#
This is the full URI that clients will use to connect to the
server.
.
This will be used in /etc/chef/client.rb as 'chef_server_url'.
URL of Chef Server (e.g., http://chef.example.com:4000):

chef-soloコマンドはChef Serverを利用しないので、chef_server_urlの設定は空欄のままにします。

root@chef-solo:~# ls -laR /etc/chef
/etc/chef:
合計 8
drwxr-xr-x  2 root root 4096 2012-04-16 22:01 .
drwxr-xr-x 82 root root 4096 2012-04-16 22:01 ..
-rw-r-----  1 root root    0 2012-04-16 22:01 client.rb
root@chef-solo:~#

このようにchef-clientプロセスの設定ファイルは空ですが、chef-clientプロセスが起動しているので停止しておきます。

root@chef-solo:~# ps auxwwwf | grep '[ c]hef'
root      3995  0.0  1.3  95376 26736 ?        S    22:01   0:00 /usr/bin/ruby1.8 /usr/bin/chef-client -d -P /var/run/chef/client.pid -L /var/log/chef/client.log -c /etc/chef/client.rb -i 1800 -s 20
root@chef-solo:~#
root@chef-solo:~# /etc/init.d/chef-client stop
 * Stopping chef-client chef-client
   ...done.
root@chef-solo:~#

さらに、自動起動しないように設定します。

root@chef-solo:~# ls -l /etc/rc*/*chef-client
lrwxrwxrwx 1 root root 21 2012-04-16 22:01 /etc/rc0.d/K02chef-client -> ../init.d/chef-client
lrwxrwxrwx 1 root root 21 2012-04-16 22:01 /etc/rc1.d/K02chef-client -> ../init.d/chef-client
lrwxrwxrwx 1 root root 21 2012-04-16 22:01 /etc/rc2.d/S99chef-client -> ../init.d/chef-client
lrwxrwxrwx 1 root root 21 2012-04-16 22:01 /etc/rc3.d/S99chef-client -> ../init.d/chef-client
lrwxrwxrwx 1 root root 21 2012-04-16 22:01 /etc/rc4.d/S99chef-client -> ../init.d/chef-client
lrwxrwxrwx 1 root root 21 2012-04-16 22:01 /etc/rc5.d/S99chef-client -> ../init.d/chef-client
lrwxrwxrwx 1 root root 21 2012-04-16 22:01 /etc/rc6.d/K02chef-client -> ../init.d/chef-client
root@chef-solo:~#
root@chef-solo:~# update-rc.d -f chef-client remove
 Removing any system startup links for /etc/init.d/chef-client ...
   /etc/rc0.d/K02chef-client
   /etc/rc1.d/K02chef-client
   /etc/rc2.d/S99chef-client
   /etc/rc3.d/S99chef-client
   /etc/rc4.d/S99chef-client
   /etc/rc5.d/S99chef-client
   /etc/rc6.d/K02chef-client
root@chef-solo:~#

chef-soloコマンドの設定

chef-soloコマンド用の設定ファイルを準備します。

root@chef-solo:~# cat > /etc/chef/solo.rb
file_cache_path "/tmp"
cookbook_path "/root/chef-solo/cookbooks"
root@chef-solo:~#

Cookbookを格納するディレクトリを設定ファイルに記載した位置に作成します。

root@chef-solo:~# mkdir -p /root/chef-solo/cookbooks
root@chef-solo:~#

設定を行っていませんがknifeコマンドは使用できるので、Cookbookの雛形を作成します。

root@chef-solo:~# knife cookbook create sample_solo -o /root/chef-solo/cookbooks
WARNING: No knife configuration file found
** Creating cookbook sample_solo
** Creating README for cookbook: sample_solo
** Creating metadata for cookbook: sample_solo
root@chef-solo:~#

/tmpにファイルを書き出すRecipeを作成します。

root@chef-solo:~# vi /root/chef-solo/cookbooks/sample_solo/recipes/default.rb
#
# Cookbook Name:: sample_solo
# Recipe:: default
#

template '/tmp/chef_solo-test' do
  source 'chef_solo-test.erb'
  mode 0644
end
root@chef-solo:~#
root@chef-solo:~# vi /root/chef-solo/cookbooks/sample_solo/templates/default/chef_solo-test.erb
Welcome to Chef Solo!

CPU   :<%= node[:cpu][:"0"][:model_name] %>
Memory:<%= node[:memory][:total] %>
OS    :<%= node[:platform] %> <%= node[:platform_version] %>
root@chef-solo:~#

Chef Serverがある場合は、実行するRecipeとChef Nodeをknifeコマンドによって結びつけていましたが、Chef Soloの場合は実行するRecipeをJSON形式のファイルで定義します。

root@chef-solo:~# cat > /root/chef-solo/chef-solo.json
{
	"run_list": [ "recipe[sample_solo]" ]
}
root@chef-solo:~#

chef-soloコマンドの実行

準備ができたところでchef-soloコマンドを実行します。-jオプションで実行するRecipeを定義したJSONファイルを与えます。また、Cookbookへのパスは先に作成した/etc/chef/solo.rbでの設定が用いられます。

root@chef-solo:~# chef-solo -j /root/chef-solo/chef-solo.json
[Mon, 16 Apr 2012 22:31:24 +0900] INFO: *** Chef 0.10.8 ***
[Mon, 16 Apr 2012 22:31:24 +0900] INFO: Setting the run_list to ["recipe[sample_solo]"] from JSON
[Mon, 16 Apr 2012 22:31:24 +0900] INFO: Run List is [recipe[sample_solo]]
[Mon, 16 Apr 2012 22:31:24 +0900] INFO: Run List expands to [sample_solo]
[Mon, 16 Apr 2012 22:31:24 +0900] INFO: Starting Chef Run for chef-solo
[Mon, 16 Apr 2012 22:31:24 +0900] INFO: Running start handlers
[Mon, 16 Apr 2012 22:31:24 +0900] INFO: Start handlers complete.
[Mon, 16 Apr 2012 22:31:24 +0900] INFO: Processing template[/tmp/chef_solo-test] action create (sample_solo::default line 6)
[Mon, 16 Apr 2012 22:31:24 +0900] INFO: template[/tmp/chef_solo-test] mode changed to 644
[Mon, 16 Apr 2012 22:31:24 +0900] INFO: template[/tmp/chef_solo-test] updated content
[Mon, 16 Apr 2012 22:31:24 +0900] INFO: Chef Run complete in 0.00459 seconds
[Mon, 16 Apr 2012 22:31:24 +0900] INFO: Running report handlers
[Mon, 16 Apr 2012 22:31:24 +0900] INFO: Report handlers complete
root@chef-solo:~#

このようにRecipeが実行され、/tmpにファイルが生成されました。

root@chef-solo:~# ls -la /tmp/
合計 12
drwxrwxrwt  2 root root 4096 2012-04-16 22:31 .
drwxr-xr-x 23 root root 4096 2012-04-02 21:29 ..
-rw-r--r--  1 root root   96 2012-04-16 22:31 chef_solo-test
root@chef-solo:~# cat /tmp/chef_solo-test
Welcome to Chef Solo!

CPU   :QEMU Virtual CPU version 1.0
Memory:2056408kB
OS    :ubuntu 11.10
root@chef-solo:~#

なお、chef-soloコマンドはデーモンプロセスとして起動することや、遠隔のCookbookを参照することも可能です。詳細はman pageやOpscode社のドキュメントを参照してください。

Author

Chef・Docker・Mirantis製品などの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

新規CTA