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:~$
