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