fbpx

Chefを使ってみよう [1]

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

Chefとは

Chefは米Opscode社が提供するオープンソースのサーバ設定管理ツールです。同様のツールではPuppetがよく知られていますが、ここ最近はChefが知名度を伸ばしてきているようです。

ChefそのものはRubyで書かれているほか、設定書であるRecipe(レシピ)もRubyで記述します。クライアント・サーバモデルで動作するほか、サーバを必要とせず単体で動作するツールも備えています。

Chefの基本的な用語

Chefでは多数の一般的な語が用いられているため、少々混乱を招きやすい点があります。そこで、まずはじめによく用いられる基本的な用語を確認しておきます。

Server

設定情報をはじめ、各種情報を集中管理するホストを指します。WebUIやREST APIを備えており、それを用いて各種クライアントと通信します。バックエンドにRabbitMQ, CouchDBを用いています。

Client

Chef Serverに接続して情報をやりとりするツールやホストを指します。非常に間違えやすいのですが、Chefで管理するホストのことではないので注意が必要です。

Node

Chefで管理するホストを指します。NodeはClientの一種ですが、ClientのすべてがNodeというわけではありません。

Workstation

Chefを管理するホストを指します。NodeではないClientの一例で、次項のKnifeを実行するホストになります。

Knife

Chefを管理するコマンドラインツールです。NodeではないClientの一例で、Knifeを実行するホストが前項のWorkstationです。

Cookbook

Recipeなどの設定情報をひとまとめにしたものです。

Recipe

Rubyで記述する設定情報の定義です。

Chefのインストール

今回は単一のホスト chef-all (10.0.2.15) にChef Server、Chef Node、Chef Workstationのすべての役割を与えてChefの動作確認を行います。

まず、Installing Chef Server on Debian or Ubuntu using Packages を参考に、Ubuntu Server 11.10にChef Server 0.10.xをインストールします。依存関係により、Chef Node、Chef Workstationに必要なパッケージもすべてインストールされます。

まず、Opscode社が準備しているChef用のapt-lineを追加します。

root@chef-all:~# echo "deb http://apt.opscode.com/ `lsb_release -cs`-0.10 main" | sudo tee /etc/apt/sources.list.d/opscode.list
deb http://apt.opscode.com/ oneiric-0.10 main
root@chef-all:~# 

root@chef-all:~# cat /etc/apt/sources.list.d/opscode.list
deb http://apt.opscode.com/ oneiric-0.10 main
root@chef-all:~#

aptレポジトリ用のGPG鍵を取得し、追加します。

root@chef-all:~# gpg --keyserver keys.gnupg.net --recv-keys 83EF826A
gpg: ディレクトリー「/home/admin/.gnupg」ができました
gpg: 新しい構成ファイル「/home/admin/.gnupg/gpg.conf」ができました
gpg: 警告: 「/home/admin/.gnupg/gpg.conf」のオプションは起動している間、有効になりません
gpg: 鍵輪「/home/admin/.gnupg/secring.gpg」ができました
gpg: 鍵輪「/home/admin/.gnupg/pubring.gpg」ができました
gpg: 鍵83EF826Aをhkpからサーバーkeys.gnupg.netに要求
gpg: /home/admin/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵83EF826A: 公開鍵“Opscode Packages <packages@opscode.com>”を読み込みました
gpg: 処理数の合計: 1
gpg:               読込み: 1
root@chef-all:~# 

root@chef-all:~# gpg --export packages@opscode.com | tee /etc/apt/trusted.gpg.d/opscode-keyring.gpg > /dev/null
root@chef-all:~# 

root@chef-all:~# aptitude update
	:
root@chef-all:~# aptitude install opscode-keyring
	:
root@chef-all:~#

Opscode社のaptレポジトリからChef Serverをインストールします。前述の通り、Chef Node、Chef Workstationに必要なパッケージもすべてインストールされます。パッケージの数が大変多いため、しばらく時間がかかります。

root@chef-all:~# aptitude install chef-server
The following NEW packages will be installed:
  ant{a} ant-optional{a} apache2-utils{a} binutils{a} build-essential{a}
  ca-certificates-java{a} chef chef-expander{a} chef-server
  chef-server-api{a} chef-server-webui{a} chef-solr{a} couchdb{a}
  couchdb-bin{a} cpp{a} cpp-4.6{a} default-jre-headless{a} dpkg-dev{a}
  erlang-asn1{a} erlang-base{a} erlang-corba{a} erlang-crypto{a}
  erlang-dev{a} erlang-docbuilder{a} erlang-edoc{a} erlang-erl-docgen{a}
  erlang-eunit{a} erlang-ic{a} erlang-inets{a} erlang-inviso{a}
  erlang-mnesia{a} erlang-nox{a} erlang-odbc{a} erlang-os-mon{a}
  erlang-parsetools{a} erlang-percept{a} erlang-public-key{a}
  erlang-runtime-tools{a} erlang-snmp{a} erlang-ssh{a} erlang-ssl{a}
  erlang-syntax-tools{a} erlang-tools{a} erlang-webtool{a} erlang-xmerl{a}
  fakeroot{a} fontconfig{a} g++{a} g++-4.6{a} gcc{a} gcc-4.6{a}
  gcj-4.6-base{a} gcj-4.6-jre-lib{a} glassfish-mail{a}
  icedtea-6-jre-cacao{a} icedtea-6-jre-jamvm{a} java-common{a} jetty{a}
  jsvc{a} libabstract-ruby1.8{a} libaddressable-ruby{a}
  libalgorithm-diff-perl{a} libalgorithm-diff-xs-perl{a}
  libalgorithm-merge-perl{a} libamqp-ruby{a} libapr1{a} libaprutil1{a}
  libasound2{a} libaudio2{a} libavahi-client3{a} libavahi-common-data{a}
  libavahi-common3{a} libbcel-java{a} libboost-dev{a} libboost1.46-dev{a}
  libbunny-ruby{a} libbunny-ruby1.8{a} libc-dev-bin{a} libc6-dev{a}
  libcap2{a} libcoderay-ruby{a} libcoderay-ruby1.8{a}
  libcommons-beanutils-java{a} libcommons-codec-java{a}
  libcommons-collections3-java{a} libcommons-compress-java{a}
  libcommons-csv-java{a} libcommons-daemon-java{a} libcommons-dbcp-java{a}
  libcommons-digester-java{a} libcommons-fileupload-java{a}
  libcommons-httpclient-java{a} libcommons-io-java{a}
  libcommons-logging-java{a} libcommons-pool-java{a} libcups2{a}
  libcurl3{a} libdaemons-ruby1.8{a} libdb-java{a} libdb-je-java{a}
  libdb5.1-java{a} libdb5.1-java-gcj{a} libdep-selector-ruby{a}
  libdpkg-perl{a} libdrm-dev{a} libecj-java{a} libem-http-request-ruby{a}
  liberubis-ruby{a} liberubis-ruby1.8{a} libescape-utils-ruby{a}
  libeventmachine-ruby{a} libeventmachine-ruby1.8{a} libextlib-ruby{a}
  libextlib-ruby1.8{a} libfast-xs-ruby{a} libffi-ruby1.8{a}
  libfssm-ruby1.8{a} libgcj-bc{a} libgcj-common{a} libgcj12{a}
  libgecode-dev{a} libgecode27{a} libgeronimo-jta-1.0.1b-spec-java{a}
  libgl1-mesa-dev{a} libgl1-mesa-dri{a} libgl1-mesa-glx{a} libglapi-mesa{a}
  libglu1-mesa{a} libglu1-mesa-dev{a} libgnuinet-java{a} libgnujaf-java{a}
  libgnumail-java{a} libgomp1{a} libgstreamer-plugins-base0.10-0{a}
  libgstreamer0.10-0{a} libhaml-ruby1.8{a} libhighline-ruby{a}
  libhmac-ruby1.8{a} libice6{a} libicu44{a} libicu4j-java{a}
  libinotify-ruby1.8{a} libjaxp1.3-java{a} libjetty-extra{a}
  libjetty-extra-java{a} libjetty-java{a} libjline-java{a} libjpeg62{a}
  libjson-ruby{a} libjson-ruby1.8{a} libjtidy-java{a} libkms1{a}
  liblcms1{a} libllvm2.9{a} liblog4j1.2-java{a} libltdl7{a}
  liblucene2-java{a} libmerb-assets-ruby{a} libmerb-assets-ruby1.8{a}
  libmerb-core-ruby1.8{a} libmerb-haml-ruby{a} libmerb-haml-ruby1.8{a}
  libmerb-helpers-ruby{a} libmerb-helpers-ruby1.8{a}
  libmerb-param-protection-ruby{a} libmerb-param-protection-ruby1.8{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} libmng1{a} libmoneta-ruby{a}
  libmoneta-ruby1.8{a} libmozjs185-1.0{a} libmpc2{a} libmpfr4{a}
  libmx4j-java{a} libmysqlclient16{a} libnet-ssh-multi-ruby{a}
  libnet-ssh2-ruby{a} libnspr4{a} libnss3{a} libnss3-1d{a} libohai-ruby{a}
  libohai-ruby1.8{a} libopenid-ruby{a} libopenid-ruby1.8{a}
  libpolyglot-ruby{a} libportlet-api-2.0-spec-java{a} libpthread-stubs0{a}
  libpthread-stubs0-dev{a} libqt4-dbus{a} libqt4-declarative{a}
  libqt4-designer{a} libqt4-dev{a} libqt4-help{a} libqt4-network{a}
  libqt4-opengl{a} libqt4-opengl-dev{a} libqt4-qt3support{a}
  libqt4-script{a} libqt4-scripttools{a} libqt4-sql{a} libqt4-sql-mysql{a}
  libqt4-svg{a} libqt4-test{a} libqt4-xml{a} libqt4-xmlpatterns{a}
  libqtcore4{a} libqtgui4{a} libqtwebkit-dev{a} libqtwebkit4{a}
  libquadmath0{a} librack-ruby{a} librack-ruby1.8{a}
  librb-inotify-ruby1.8{a} libreadline5{a} libregexp-java{a}
  librestclient-ruby{a} libruby1.8{a} libsctp1{a} libservlet2.5-java{a}
  libslf4j-java{a} libsm6{a} libstdc++6-4.6-dev{a} libsystemu-ruby1.8{a}
  libtiff4{a} libtomcat6-java{a} libtreetop-ruby{a} libuuidtools-ruby{a}
  libuuidtools-ruby1.8{a} libx11-dev{a} libxau-dev{a} libxcb1-dev{a}
  libxdamage1{a} libxdmcp-dev{a} libxerces2-java{a} libxext-dev{a}
  libxfixes3{a} libxi6{a} libxml-commons-external-java{a} libxml-ruby1.8{a}
  libxt6{a} libxxf86vm1{a} libyajl-ruby{a} linux-libc-dev{a}
  lksctp-tools{a} make{a} manpages-dev{a} merb-core{a} mesa-common-dev{a}
  mysql-common{a} odbcinst{a} odbcinst1debian2{a} ohai{a}
  openjdk-6-jre-headless{a} openjdk-6-jre-lib{a} qdbus{a}
  qt4-linguist-tools{a} qt4-qmake{a} rabbitmq-server{a} rake{a}
  ruby-addressable{a} ruby-daemons{a} ruby-highline{a} ruby-hmac{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} solr-common{a} solr-jetty{a}
  thin{a} thin1.8{a} tzdata-java{a} unixodbc{a} unzip{a} x11-common{a}
  x11proto-core-dev{a} x11proto-input-dev{a} x11proto-kb-dev{a}
  x11proto-xext-dev{a} xorg-sgml-doctools{a} xtrans-dev{a} zip{a}
0 packages upgraded, 295 newly installed, 0 to remove and 0 not upgraded.
Need to get 213 MB of archives. After unpacking 691 MB will be used.
Do you want to continue? [Y/n/?] y
	:

インストール中、以下の質問が表示されます。

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 Client(Chef NodeおよびChef Workstation)がデフォルトで接続するChef Serverを指定します。今回はChef ClientもChef Serverも同一のホストなので、デフォルトで自分自身に接続するようにします。このホストは chef-all (10.0.2.15) なので、http://chef-all:4000 とします。もちろんIPアドレスで指定してもかまいません。

New password for the 'chef' AMQP user in the RabbitMQ vhost "/chef":

RabbitMQのchefユーザのパスワードを設定します。

New password for the 'admin' user in the Chef Server WebUI:

Chef ServerのWebUIのパスワードを設定します。

以上でChefのインストールは完了します。プロセスを確認してみます。

root@chef-all:~# ps auxwwwf
	:
root     11478  0.0  1.3  95352 26748 ?        S    22:00   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
couchdb  11588  0.0  0.0   4272   680 ?        S    22:00   0:00 /bin/sh -e /usr/bin/couchdb -a /etc/couchdb/default.ini -a /etc/couchdb/local.ini -b -r 5 -p /var/run/couchdb/couchdb.pid -o /dev/null -e /dev/null -R
couchdb  11595  0.0  0.0   4272   352 ?        S    22:00   0:00  \_ /bin/sh -e /usr/bin/couchdb -a /etc/couchdb/default.ini -a /etc/couchdb/local.ini -b -r 5 -p /var/run/couchdb/couchdb.pid -o /dev/null -e /dev/null -R
couchdb  11596  0.3  0.7  73844 15528 ?        Sl   22:00   0:00      \_ /usr/lib/erlang/erts-5.8.3/bin/beam -Bd -K true -A 4 -- -root /usr/lib/erlang -progname erl -- -home /var/lib/couchdb -- -noshell -noinput -sasl errlog_type error -couch_ini /etc/couchdb/default.ini /etc/couchdb/local.ini /etc/couchdb/default.ini /etc/couchdb/local.ini -s couch -pidfile /var/run/couchdb/couchdb.pid -heart
couchdb  11604  0.0  0.0   4036   324 ?        Ss   22:00   0:00          \_ heart -pid 11596 -ht 11
couchdb  13162  0.0  0.3  92380  6844 ?        Ssl  22:01   0:00          \_ /usr/lib/couchdb/bin/couchjs /usr/share/couchdb/server/main.js
rabbitmq 12532  0.0  0.0   6808   320 ?        S    22:00   0:00 /usr/lib/erlang/erts-5.8.3/bin/epmd -daemon
root     12537  0.0  0.0   4272   584 ?        Ss   22:00   0:00 sh -c /usr/sbin/rabbitmq-server > /var/log/rabbitmq/startup_log             2> /var/log/rabbitmq/startup_err
root     12540  0.0  0.0   4272   584 ?        S    22:00   0:00  \_ /bin/sh /usr/sbin/rabbitmq-server
rabbitmq 12543  0.0  0.0  41628  1364 ?        S    22:00   0:00      \_ su rabbitmq -s /bin/sh -c /usr/lib/rabbitmq/bin/rabbitmq-server
rabbitmq 12545  0.0  0.0   4272   584 ?        S    22:00   0:00          \_ sh -c /usr/lib/rabbitmq/bin/rabbitmq-server
rabbitmq 12546  3.0  3.0 103036 62464 ?        Sl   22:00   0:01              \_ /usr/lib/erlang/erts-5.8.3/bin/beam -W w -K true -A30 -P 1048576 -- -root /usr/lib/erlang -progname erl -- -home /var/lib/rabbitmq -- -noshell -noinput -sname rabbit@chef-all -boot /var/lib/rabbitmq/mnesia/rabbit@chef-server-plugins-expand/rabbit -kernel inet_default_connect_options [{nodelay,true}] -sasl errlog_type error -kernel error_logger {file,"/var/log/rabbitmq/rabbit@chef-server.log"} -sasl sasl_error_logger {file,"/var/log/rabbitmq/rabbit@chef-server-sasl.log"} -os_mon start_cpu_sup true -os_mon start_disksup false -os_mon start_memsup false -mnesia dir "/var/lib/rabbitmq/mnesia/rabbit@chef-server"
rabbitmq 12621  0.0  0.0   4164   324 ?        Ss   22:00   0:00                  \_ /usr/lib/erlang/lib/os_mon-2.2.5/priv/bin/cpu_sup
rabbitmq 12622  0.0  0.0   6776   344 ?        Ss   22:00   0:00                  \_ inet_gethost 4
rabbitmq 12623  0.0  0.0   8876   632 ?        S    22:00   0:00                      \_ inet_gethost 4
chef     12890  2.4  5.1 581660 106392 ?       Sl   22:00   0:01 java -Xmx256M -Xms256M -Dsolr.data.dir=/var/cache/chef/solr/data -Dsolr.solr.home=/var/lib/chef/solr -DSTART=/var/lib/chef/solr/solr-jetty/etc/start.config -jar /var/lib/chef/solr/solr-jetty/start.jar
root     12952  0.0  0.7  81420 15244 ?        S    22:00   0:00 /usr/bin/ruby1.8 /usr/bin/chef-expander -d -c /etc/chef/solr.rb -P /var/run/chef/expander.pid -L /var/log/chef/expander.log -n 1 -i 1
root     12953  1.5  1.8 104984 37736 ?        S    22:00   0:00  \_ chef-expander worker #1 (vnodes 0-1023)
chef     13111  2.0  2.7 165216 57052 ?        Sl   22:01   0:00 merb : chef-server (api) : worker (port 4000)
chef     13276  1.9  2.5 135376 52568 ?        Sl   22:01   0:00 merb : chef-server-webui : worker (port 4040)
root@chef-all:~#

Chef Clientの設定

Chef Serverに接続するための、Chef Clientとして操作を行う、Linuxユーザの設定を行います。ここではその操作ユーザを admin とします。

まず、Chef Serverに接続するために生成された秘密鍵を操作ユーザの~/.chef/ディレクトリにコピーします。鍵ファイルの所有者は操作ユーザに変更し、パーミッションは600である必要があります。

admin@chef-all:~$ mkdir ~/.chef
admin@chef-all:~$ sudo cp /etc/chef/validation.pem /etc/chef/webui.pem ~/.chef
admin@chef-all:~$ sudo chown -R admin ~/.chef/
admin@chef-all:~$ 

admin@chef-all:~$ ls -al .chef/
合計 16
drwxrwxr-x 2 admin admin   4096 2012-04-02 22:30 .
drwxr-xr-x 5 admin admin   4096 2012-04-02 22:30 ..
-rw------- 1 admin root    1679 2012-04-02 22:30 validation.pem
-rw------- 1 admin root    1679 2012-04-02 22:30 webui.pem
admin@chef-all:~$

knifeコマンドを実行して、操作ユーザの初期設定を行います。

対話的に設定を行うことができます。ほとんどはそのままエンターキーで進んで問題ありませんが、鍵ファイルの位置が /etc/chef になっているので、操作ユーザの ~/.chef/ に変更してください。

admin@chef-all:~$ knife configure -i
WARNING: No knife configuration file found
Where should I put the config file? [~/.chef/knife.rb]
Please enter the chef server URL: [http://chef-all:4000]
Please enter a clientname for the new client: [admin]
Please enter the existing admin clientname: [chef-webui]
Please enter the location of the existing admin client's private key: [/etc/chef/webui.pem]

/home/admin/.chef/webui.pem

Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef/validation.pem]

/home/admin/.chef/validation.pem

Please enter the path to a chef repository (or leave blank):
Creating initial API user...
Created client[admin]
Configuration file written to /home/admin/.chef/knife.rb
admin@chef-all:~$

設定ファイルが生成されたことを確認します。

admin@chef-all:~$ ls -la .chef/
合計 24
drwxrwxr-x 2 admin admin   4096 2012-04-02 22:42 .
drwxr-xr-x 5 admin admin   4096 2012-04-02 22:30 ..
-rw-rw-r-- 1 admin admin   1679 2012-04-02 22:42 admin.pem
-rw-rw-r-- 1 admin admin    382 2012-04-02 22:42 knife.rb
-rw------- 1 admin root    1679 2012-04-02 22:30 validation.pem
-rw------- 1 admin root    1679 2012-04-02 22:30 webui.pem
admin@chef-all:~$ 

admin@chef-all:~$ cat .chef/knife.rb
log_level                :info
log_location             STDOUT
node_name                'admin'
client_key               '/home/admin/.chef/admin.pem'
validation_client_name   'chef-validator'
validation_key           '/home/admin/.chef/validation.pem'
chef_server_url          'http://chef-all:4000'
cache_type               'BasicFile'
cache_options( :path => '/home/admin/.chef/checksums' )
admin@chef-all:~$

knifeコマンドを実行することでも設定の確認が行えます。

admin@chef-all:~$ knife client show admin
_rev:        1-18aa9cce3066b3e8950903b08a4b378d
admin:       true
chef_type:   client
json_class:  Chef::ApiClient
name:        admin
public_key:  -----BEGIN RSA PUBLIC KEY-----
             MIIBCgKCAQEAv2dp0peH1cOLLSnjvwsrdS2eMI+dCKT2PlnlKbxz/xhp4glXXDC+
		:
		:
		:
		:
             EBhuS+biDxALHfnZaFojflEBXa4BOPJcqwIDAQAB
             -----END RSA PUBLIC KEY-----
admin@chef-all:~$

Cookbookの作成

では、簡単なRecipeを持つCookbookを作成してみます。knifeコマンドでCookbookの雛形を生成することができます。ここではsampleという名前のCookbookを作成します。

admin@chef-all:~$ knife cookbook create sample
** Creating cookbook sample
** Creating README for cookbook: sample
** Creating metadata for cookbook: sample
admin@chef-all:~$

Cookbookは/var/chef/cookbooks/に生成されます。なお、-oオプションで作成先のディレクトリを指定することができます。

admin@chef-all:~$ ls -laR /var/chef/cookbooks/sample/
/var/chef/cookbooks/sample/:
合計 48
drwxrwxr-x 10 admin admin 4096 2012-04-03 21:23 .
drwxrwxr-x  3 admin admin 4096 2012-04-03 21:23 ..
-rw-rw-r--  1 admin admin   88 2012-04-03 21:23 README.md
drwxrwxr-x  2 admin admin 4096 2012-04-03 21:23 attributes
drwxrwxr-x  2 admin admin 4096 2012-04-03 21:23 definitions
drwxrwxr-x  3 admin admin 4096 2012-04-03 21:23 files
drwxrwxr-x  2 admin admin 4096 2012-04-03 21:23 libraries
-rw-rw-r--  1 admin admin  250 2012-04-03 21:23 metadata.rb
drwxrwxr-x  2 admin admin 4096 2012-04-03 21:23 providers
drwxrwxr-x  2 admin admin 4096 2012-04-03 21:23 recipes
drwxrwxr-x  2 admin admin 4096 2012-04-03 21:23 resources
drwxrwxr-x  3 admin admin 4096 2012-04-03 21:23 templates

/var/chef/cookbooks/sample/attributes:
合計 8
drwxrwxr-x  2 admin admin 4096 2012-04-03 21:23 .
drwxrwxr-x 10 admin admin 4096 2012-04-03 21:23 ..

/var/chef/cookbooks/sample/definitions:
合計 8
drwxrwxr-x  2 admin admin 4096 2012-04-03 21:23 .
drwxrwxr-x 10 admin admin 4096 2012-04-03 21:23 ..

/var/chef/cookbooks/sample/files:
合計 12
drwxrwxr-x  3 admin admin 4096 2012-04-03 21:23 .
drwxrwxr-x 10 admin admin 4096 2012-04-03 21:23 ..
drwxrwxr-x  2 admin admin 4096 2012-04-03 21:23 default

/var/chef/cookbooks/sample/files/default:
合計 8
drwxrwxr-x 2 admin admin 4096 2012-04-03 21:23 .
drwxrwxr-x 3 admin admin 4096 2012-04-03 21:23 ..

/var/chef/cookbooks/sample/libraries:
合計 8
drwxrwxr-x  2 admin admin 4096 2012-04-03 21:23 .
drwxrwxr-x 10 admin admin 4096 2012-04-03 21:23 ..

/var/chef/cookbooks/sample/providers:
合計 8
drwxrwxr-x  2 admin admin 4096 2012-04-03 21:23 .
drwxrwxr-x 10 admin admin 4096 2012-04-03 21:23 ..

/var/chef/cookbooks/sample/recipes:
合計 12
drwxrwxr-x  2 admin admin 4096 2012-04-03 21:23 .
drwxrwxr-x 10 admin admin 4096 2012-04-03 21:23 ..
-rw-rw-r--  1 admin admin  132 2012-04-03 21:23 default.rb

/var/chef/cookbooks/sample/resources:
合計 8
drwxrwxr-x  2 admin admin 4096 2012-04-03 21:23 .
drwxrwxr-x 10 admin admin 4096 2012-04-03 21:23 ..

/var/chef/cookbooks/sample/templates:
合計 12
drwxrwxr-x  3 admin admin 4096 2012-04-03 21:23 .
drwxrwxr-x 10 admin admin 4096 2012-04-03 21:23 ..
drwxrwxr-x  2 admin admin 4096 2012-04-03 21:23 default

/var/chef/cookbooks/sample/templates/default:
合計 8
drwxrwxr-x 2 admin admin 4096 2012-04-03 21:23 .
drwxrwxr-x 3 admin admin 4096 2012-04-03 21:23 ..
admin@chef-all:~$

Chefを試すで紹介されているCookbookを頂きます。

admin@chef-all:~$ vi /var/chef/cookbooks/sample/recipes/default.rb
#
# Cookbook Name:: sample
# Recipe:: default
#

template '/tmp/chef-test' do
  source 'chef-test.erb'
  mode 0644
end
admin@chef-all:~$

これは/tmp/chef-testファイルをパーミッション0644で生成し、Templateとしてchef-test.erbファイルを用いるというRecipeです。

admin@chef-all:~$ vi /var/chef/cookbooks/sample/templates/default/chef-test.erb
Welcome to Chef!

CPU   :<%= node[:cpu][:"0"][:model_name] %>
Memory:<%= node[:memory][:total] %>
OS    :<%= node[:platform] %> <%= node[:platform_version] %>
admin@chef-all:~$

これはNodeの情報を表示するTemplateです。今回はファイル内容の詳細については省略します。

knifeコマンドでこのsample CookbookをChef Serverに登録します。

admin@chef-all:~$ knife cookbook upload sample
Uploading sample             [0.0.1]
upload complete
admin@chef-all:~$

knifeコマンドでsample CookbookがChef Serverに登録されたことを確認します。

admin@chef-all:~$ knife cookbook list
sample   0.0.1
admin@chef-all:~$ knife recipe list
sample:
  0.0.1:  default
admin@chef-all:~$

NodeへRecipeの適用

では、sample CookbookをChef Nodeに適用します。今回はChef NodeはChef Serverと同一ホストであるchef-allとします。

knifeコマンドで、chef-allのNodeとしての状態を確認します。

admin@chef-all:~$ knife node show chef-all
Node Name:   chef-all
Environment: _default
FQDN:        chef-all
IP:          10.0.2.15
Run List:
Roles:
Recipes:
Platform:    ubuntu 11.10
admin@chef-all:~$

knifeコマンドで、Nodeであるchef-allにsample Recipeを追加します。

admin@chef-all:~$ knife node run_list add chef-all 'recipe[sample]'
run_list:  recipe[sample]
admin@chef-all:~$

knifeコマンドで、Nodeであるchef-allにsample Recipeが追加されたことを確認します。

admin@chef-all:~$ knife node show chef-all
Node Name:   chef-all
Environment: _default
FQDN:        chef-all
IP:          10.0.2.15
Run List:    recipe[sample]
Roles:
Recipes:
Platform:    ubuntu 11.10
admin@chef-all:~$

/var/log/chef/client.log を確認します。

[Tue, 03 Apr 2012 21:38:09 +0900] INFO: *** Chef 0.10.8 ***
[Tue, 03 Apr 2012 21:38:09 +0900] INFO: Run List is [recipe[sample]]
[Tue, 03 Apr 2012 21:38:09 +0900] INFO: Run List expands to [sample]
[Tue, 03 Apr 2012 21:38:09 +0900] INFO: Starting Chef Run for chef-all
[Tue, 03 Apr 2012 21:38:09 +0900] INFO: Running start handlers
[Tue, 03 Apr 2012 21:38:09 +0900] INFO: Start handlers complete.
[Tue, 03 Apr 2012 21:38:09 +0900] INFO: Loading cookbooks [sample]
[Tue, 03 Apr 2012 21:38:09 +0900] INFO: Storing updated cookbooks/sample/recipes/default.rb in the cache.
[Tue, 03 Apr 2012 21:38:09 +0900] INFO: Storing updated cookbooks/sample/metadata.rb in the cache.
[Tue, 03 Apr 2012 21:38:09 +0900] INFO: Storing updated cookbooks/sample/README.md in the cache.
[Tue, 03 Apr 2012 21:38:09 +0900] INFO: Processing template[/tmp/chef-test] action create (sample::default line 6)
[Tue, 03 Apr 2012 21:38:09 +0900] INFO: template[/tmp/chef-test] mode changed to 644
[Tue, 03 Apr 2012 21:38:09 +0900] INFO: template[/tmp/chef-test] updated content
[Tue, 03 Apr 2012 21:38:10 +0900] INFO: Chef Run complete in 0.172887 seconds
[Tue, 03 Apr 2012 21:38:10 +0900] INFO: Running report handlers
[Tue, 03 Apr 2012 21:38:10 +0900] INFO: Report handlers complete

このように、Recipeが実行されたことがわかります。/tmp/chef-testが生成されたことを確認します。

admin@chef-all:~$ ls -l /tmp/chef-test
-rw-r--r-- 1 root root 91 2012-04-03 21:38 /tmp/chef-test
admin@chef-all:~$ cat /tmp/chef-test
Welcome to Chef!

CPU   :QEMU Virtual CPU version 1.0
Memory:2056408kB
OS    :ubuntu 11.10
admin@chef-all:~$

このファイルを削除してみます。

admin@chef-all:~$ sudo rm /tmp/chef-test
admin@chef-all:~$

これですぐ生成し直されるか、というとそうではありません。Chef NodeがChef Serverに問い合わせを行って始めてRecipeが再実行されます。

デフォルトでは、Chef Serverに定期的に問い合わせを行うchef-client というデーモンプロセスが起動しています。

admin@chef-all:~$ ps auxwwwf | grep '[ c]hef-client'
root      2659  0.0  1.4 108104 29820 ?        S    21:38   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
admin@chef-all:~$

chef-clientデーモンはデフォルトでは -i 1800 -s 20 (インターバル 1800 秒 + 0〜20 秒) の間隔でChef Serverに問い合わせを行っています。そこで、問い合わせが行われるまでしばらく待ってみます。

[Tue, 03 Apr 2012 22:08:25 +0900] INFO: *** Chef 0.10.8 ***
[Tue, 03 Apr 2012 22:08:25 +0900] INFO: Run List is [recipe[sample]]
[Tue, 03 Apr 2012 22:08:25 +0900] INFO: Run List expands to [sample]
[Tue, 03 Apr 2012 22:08:25 +0900] INFO: Starting Chef Run for chef-all
[Tue, 03 Apr 2012 22:08:25 +0900] INFO: Running start handlers
[Tue, 03 Apr 2012 22:08:25 +0900] INFO: Start handlers complete.
[Tue, 03 Apr 2012 22:08:25 +0900] INFO: Loading cookbooks [sample]
[Tue, 03 Apr 2012 22:08:25 +0900] INFO: Processing template[/tmp/chef-test] action create (sample::default line 6)
[Tue, 03 Apr 2012 22:08:25 +0900] INFO: template[/tmp/chef-test] mode changed to 644
[Tue, 03 Apr 2012 22:08:25 +0900] INFO: template[/tmp/chef-test] updated content
[Tue, 03 Apr 2012 22:08:25 +0900] INFO: Chef Run complete in 0.116057 seconds
[Tue, 03 Apr 2012 22:08:25 +0900] INFO: Running report handlers
[Tue, 03 Apr 2012 22:08:25 +0900] INFO: Report handlers complete

このように、30分程度の経過後に問い合わせが行われ、Recipeが実行されました。/tmp/chef-testが生成されたことを確認します。

admin@chef-all:~$ ls -l /tmp/chef-test
-rw-r--r-- 1 root root 91 2012-04-03 22:08 /tmp/chef-test
admin@chef-all:~$ cat /tmp/chef-test
Welcome to Chef!

CPU   :QEMU Virtual CPU version 1.0
Memory:2056408kB
OS    :ubuntu 11.10
admin@chef-all:~$

再度、このファイルを削除します。

admin@chef-all:~$ sudo rm /tmp/chef-test
admin@chef-all:~$

すぐにRecipeを反映したい場合はchef-clientコマンドをNode上で直接実行します。

admin@chef-all:~$ sudo chef-client
[Tue, 03 Apr 2012 22:11:07 +0900] INFO: *** Chef 0.10.8 ***
[Tue, 03 Apr 2012 22:11:07 +0900] INFO: Run List is [recipe[sample]]
[Tue, 03 Apr 2012 22:11:07 +0900] INFO: Run List expands to [sample]
[Tue, 03 Apr 2012 22:11:07 +0900] INFO: Starting Chef Run for chef-all
[Tue, 03 Apr 2012 22:11:07 +0900] INFO: Running start handlers
[Tue, 03 Apr 2012 22:11:07 +0900] INFO: Start handlers complete.
[Tue, 03 Apr 2012 22:11:07 +0900] INFO: Loading cookbooks [sample]
[Tue, 03 Apr 2012 22:11:07 +0900] INFO: Processing template[/tmp/chef-test] action create (sample::default line 6)
[Tue, 03 Apr 2012 22:11:07 +0900] INFO: template[/tmp/chef-test] mode changed to 644
[Tue, 03 Apr 2012 22:11:07 +0900] INFO: template[/tmp/chef-test] updated content
[Tue, 03 Apr 2012 22:11:07 +0900] INFO: Chef Run complete in 0.112569 seconds
[Tue, 03 Apr 2012 22:11:07 +0900] INFO: Running report handlers
[Tue, 03 Apr 2012 22:11:07 +0900] INFO: Report handlers complete
admin@chef-all:~$

そうすると即座にChef Serverに問い合わせが行われ、Recipeが実行されます。

admin@chef-all:~$ ls -l /tmp/chef-test
-rw-r--r-- 1 root root 91 2012-04-03 22:11 /tmp/chef-test
admin@chef-all:~$ cat /tmp/chef-test
Welcome to Chef!

CPU   :QEMU Virtual CPU version 1.0
Memory:2056408kB
OS    :ubuntu 11.10
admin@chef-all:~$

Author

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

Daisuke Higuchiの記事一覧

新規CTA